這是我們為大家提供的一篇介紹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將占用用戶的工作線程。
以上就是我們為大家提供的對android 的handler 機制的相關介紹,希望對大家有所幫助!