andorid 的Handler是一個非常有用的機制,但通過源碼,我們可以發(fā)現(xiàn)Handler機制其實非常復雜错洁,對于初學者(例如我)來說,看源碼或是看那些關于Handler非常詳細的文章會容易搞混自己戒突,所以這是一篇關于Handler的簡解屯碴,主要是想讓讀者理解Handler,在接下來我會陸續(xù)發(fā)一些Handler的詳解。
首先我們來看一下官方的api:
A Handler allows you to send and process Message and Runnable objects associated with a thread’s MessageQueue. Each Handler instance is associated with a single thread and that thread’s message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it – from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue.
從這段話我們可知:Handler是一個在不同線程里發(fā)送和處理信息的機制膊存,也就是在不同線程里充當通訊兵的角色导而。
首先來看一下:
我們要想點擊按鈕改變textview的文字(Hello World),我們初學者想到的一般是:
TextView textView=(TextView)findViewById(R.id.textView);
public void HandlerClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
textView.setText("你想改啥就改啥");
}
}).start();
}
但是通過運行我們可以發(fā)現(xiàn)—–運行錯誤8羝椤今艺!
這是為什么呢?這就關系到安卓的多線程問題了爵卒,安卓是不允許在ui線程之外訪問ui工具包的虚缎,我們可以這樣想,android中各自的線程都是獨立的技潘,textview在主線程中遥巴,自然輪不到其他線程擅自更改,你想要改只能建議我來改享幽,改不改還得看我心情!拾弃!那么是通過一個怎樣的機制建議我改一下textview呢值桩?相信大家都猜出了—-Handler!豪椿!
貼一下修改之后完整的代碼:
package com.example.hellotest;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView)findViewById(R.id.textView);
}
public void HandlerClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
handler.sendEmptyMessage(100);
}
}).start();
}
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 100:
textView.setText("你想改啥就改啥");
break;
}
}
};
}
因為這是一篇簡解奔坟,所以我只簡單介紹一下上述代碼,詳細的歡迎看我的下一篇關于Handler的博客搭盾。
handler.sendEmptyMessage(100);
這個方法作用是傳遞信息咳秉,將100傳到主線程中(100只是隨便寫的數(shù)字,任何int類型數(shù)字都可以傳遞)鸯隅,要想傳遞字符串或者其他類型的數(shù)據(jù)也可以通過不同的方法傳遞
再來看下
public void handleMessage(Message msg){}
這個方法是接收信息澜建,我們姑且認為msg.what 是接收整型數(shù)據(jù)的吧,細心的你或許發(fā)現(xiàn)了還有msg.obj,msg.arg 等接收不同數(shù)據(jù)的代碼蝌以,這里留到下一篇在細細解讀炕舵。