android學習筆記——android多線程編程初探

在本篇文章中將會介紹到的內容有:
1.介紹多線程用處
2.線程的基本用法
3.簡單講解異步消息處理機制(用於更新UI)

1.多線程
當我們需要執行一些耗時操作時,如果單純的將耗時操作交給主線程去做,那麼有可能別的一些更需要主線程做的任務就被耽擱了(如UI的更新),導致了主線程被阻塞,影響了用戶對軟件的正常使用。所以需要將一些耗時的操作分配給子線程去做,提高軟件的友好性。

2.線程的基本用法
線程的基本用法主要有3種:

(1)寫個類繼承Thread,然後重寫父類的run()方法,在其中寫上耗時邏輯
     class MyThread extends Thread{
          @Override
          public void run(){
               //處理具體的邏輯
          }
     }
啓動該線程的方法:
     new MyThread().start();

上述方法因爲是使用了繼承的方式,所以耦合性比較高,並不推薦使用。

(2)選擇實現Runnable接口來降低耦合
     class MyThread implements Runnable{
          @Override
          public void run(){
               //處理具體的邏輯
          }
     }
啓動該線程的方法:
     MyThread myThread = new MyThread();
     new Thread(myThread).start();

(3)使用匿名類的方式,這種方法更爲常見
     new Thread(new Runnable (){
          @Override
          public void run(){
               //處理具體的邏輯
          }
     }.start();

3.簡單講解異步消息處理機制(用於更新UI)
首先要明確的一點是在android中對於UI的更新,是不允許在子線程中執行的,會發生錯誤,只能在主線程中進行執行。子線程中做耗時的操作,在主線程中做UI的更新。
用一個小的demo介紹一下
public class HandlerActivity extends Activity {

public static final int UPDATE_TEXT = 1;
private Button mButton;
private TextView mTextView;
private Handler handler = new Handler(){

//處理消息在主線程中
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub

switch (msg.what) {
case UPDATE_TEXT:
     mTextView.setText("it is changed");
     break;

default:
     break;
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_handler);

mButton = (Button)findViewById(R.id.change_text);
mTextView = (TextView)findViewById(R.id.handle_textView);

mButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(new Runnable() {

//子線程運行下面的代碼
@Override
public void run() {
// TODO Auto-generated method stub
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);

//子線程運行耗時操作,修改UI的操作放在handler的主線程中處理
try {
     Thread.sleep(1000);
} catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
}
}
}).start();
          }
});
}
}

上述的異步消息處理機制需要我們理解4個概念,handler、message、MessageQueue、looper
  • handler : 是整個異步消息處理機制中的控制者,處理者。它負責發送和處理消息
  • message : 主要是在不同的線程之間傳遞消息,作爲一個消息的載體,其中的what字段等等,可以攜帶一定的數據信息。
  • MessageQueue: 消息隊列,整個程序可能有很多異步消息需要處理,但是對於一個線程來說(主線程),只能有一個handler ,MessageQueue。所以我們需要把還沒有處理的消息放入消息隊列當中。
  • looper:它相當於MessageQueue中的調度者,通過調用loop方法,進行一個無限循環,不斷的從消息隊列中取出消息,發送給 handler進行處理。
我們再對異步消息處理的流程梳理一遍。首先要在主線程中創建一個Handler對象,並重寫handleMessage()方法。然後當子線程需要更新UI時,就創建一個Message對象,通過Handler對象將這條信息發送出去。之後這條信息會被添加到MessageQueue隊列中等待被處理,而Looper會一直嘗試從MessageQueue中取出待處理消息,分發回Handler的handleMessage()方法中去。由於Handler是在主線程中創建的,所以此時handleMessage()方法也是在主線程中運行的,於是我們可以放心的更新UI操作。
關於Handler異步消息處理機制的簡單講解可以查看:http://android.jobbole.com/80853/
深入講解可查看:http://blog.csdn.net/lmj623565791/article/details/38377229(比較深入,還不怎麼明白)
對於異步消息處理機制,android中還提供了一個AsyncTask,這個機制更加簡潔方便,詳細可參考:http://www.cnblogs.com/suinuaner/archive/2013/04/11/android_fifty.html   (demo中有一句問題,要注意)
也可參看我下一篇關於AsyncTask的介紹和使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章