android 的handler 機制

在android中,用戶自己創建的工作線程和UI主線程是不同的線程。handler 是android中一種消息的異步處理機制。在用戶未給自己的工作線程創建Looper,即默認情況下,handler 會在主線程的Looper下進行消息處理,這時handler佔用主線程。

  當用戶在啓動自己的工作線程時調用Looper.prepare(),這時創建了自己的Looper,當我們利用handler進行消息處理時,自己的工作線程將和主線程不是同一個線程。代碼如下:

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class Demo1 extends Activity{

   private Button button1,button2;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       // TODO Auto-generated method stub
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main2);
       button1=(Button)findViewById(R.id.button1);
       button1.setOnClickListener(new View.OnClickListener() {    
           @Override
           public void onClick(View v) {
               // TODO Auto-generated method stub
               MyThread myThread=new MyThread();
               myThread.start();
               Log.i("main Thread UI id:",Thread.currentThread().getId()+"");
           }
       });
   }


   class MyHandler extends Handler {

       public MyHandler(Looper looper){
           super(looper);
       }

       @Override
       public void handleMessage(Message msg) {
           // TODO Auto-generated method stub
           super.handleMessage(msg);
           Log.i("handler thread id:",Thread.currentThread().getId()+"");    
       }    
   }

   class MyThread extends Thread {
        private MyHandler myHandler;
        private  String obj;
       public void run(){
             Looper myLopper ;
             Looper.prepare();
             myLopper=Looper.myLooper();
             myHandler=new MyHandler(myLopper);
              Log.i("my thread id:",""+Thread.currentThread().getId());
              obj="my thread";    
              myHandler.removeMessages(0);
             Message message=myHandler.obtainMessage(1,1,1,obj);
             myHandler.sendMessage(message);
             Looper.loop();

       }

   }

}

運行結果如下:

I/main Thread UI id:(  725): 1
I/my thread id:(  725): 8
I/handler thread id:(  725): 8

由此可見,當我們創建自己的Looper時,系統的handler將佔用用戶的工作線程。



本文出自 “孤獨的守望者” 博客,請務必保留此出處http://lvg2010.blog.51cto.com/1318947/503935


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