Android學習--12-多線程

說說遺留的問題

碎片( Fragment)java

第4章 看得挺頭疼,沒弄明白,不寫了。多線程

第8章 多媒體,例子不少。異步

對於像我同樣的初學者來講,這書入門挺好,建議購買,網上也有此書每章的源碼。ide

文章都不是寫的很詳細,就寫點要點,防止本身忘記。oop

後面的問題

粗看比較快,在看書中的天氣實例。 碼雲weatherSimple,後續有空會寫實例步驟。線程

多線程

java的多線程就不介紹了code

Handler

Android 不容許在子線程中進行UI操做對象

因此Android提供了異步消息處理機制繼承

異步消息,應該有哪些組成?隊列

  1. 消息 Message
  2. 處理消息 Handler
  3. 消息隊列 MessageQueue
  4. 管理消息隊列 Looper

輸入圖片說明

public class MainActivity extends Activity implements OnClickListener {
    public static final int UPDATE_TEXT = 1;
    private TextView text;
    private Button changeText;
    private Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case UPDATE_TEXT:
        // 在這裏能夠進行UI操做
            text.setText("Nice to meet you");
            break;
        default:
            break;
        }
    }
};
……
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.change_text:
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Message message = new Message();
                    message.what = UPDATE_TEXT;
                    handler.sendMessage(message); // 將Message對象發送出去
                }    
        }).start();
            break;
        default:
            break;
        }
    }
}

使用AsyncTask

使用方法 繼承AsyncTask

class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
    ……
}

而後啓動 new DownloadTask().execute();

四個能夠重寫的方法:

  1. onPreExecute() 前執行
  2. doInBackground(Params...) 執行中,不能夠對UI進行操做 ,但能夠 publishProgress()來切換到UI 線程
  3. onProgressUpdate(Progress...) 執行中,能夠對UI進行操做
  4. onPostExecute(Result) 執行完後
class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
    @Override
    protected void onPreExecute() {
        progressDialog.show(); // 顯示進度對話框
    }
    @Override
    protected Boolean doInBackground(Void... params) {
        try {
            while (true) {
                int downloadPercent = doDownload(); // 這是一個虛構的方法
                publishProgress(downloadPercent);
                if (downloadPercent >= 100) {
                    break;
                }        
          }
    } catch (Exception e) {
        return false;
    }
    return true;
}

    @Override
    protected void onProgressUpdate(Integer... values) {
        // 在這裏更新下載進度
        progressDialog.setMessage("Downloaded " + values[0] + "%");
    }
    @Override
    protected void onPostExecute(Boolean result) {
        progressDialog.dismiss(); // 關閉進度對話框
        // 在這裏提示下載結果
        if (result) {
            Toast.makeText(context, "Download succeeded",
            Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(context, " Download failed",
            Toast.LENGTH_SHORT).show();
        }
    }
}
相關文章
相關標籤/搜索