Android--Handler初步理解及基本使用
1、什么是Handler
Handler是android給我們提供用來更新UI的一套機制;也是一套消息處理機制,可以發送消息,也可以通過它處理消息。
2、Android為什么需要Handler機制來更新UI?
根本目的:解決多線程并發問題。
比如在一個Activity中有多個線程去更新一個UI,且沒有加鎖的情況下,是會出現更新界面錯亂的。如果對更新UI進行加鎖,又會出現應用性能下降的問題。
3、如何使用Handler
3.1、基本使用
private Handler handler1 = new Handler(){
public void handleMessage(android.os.Message msg) {
T.show(TestHandlerActivity.this, "handleMessage");
};
};
//給Handler發送消息
public void testHandler(View v){
//發送一個空消息
handler1.sendEmptyMessage(i);
i++;
//發送一個自已定義的Message
Message obtainMessage = handler1.obtainMessage();
//攜帶一個int類型
obtainMessage.arg1 = 0;
//攜帶一個int類型
obtainMessage.arg2 = 1;
//攜帶一個objcet
obtainMessage.obj = new Person("thc","cool");
//Message的標志
obtainMessage.what = 1;
handler1.sendMessage(obtainMessage);
//也可以 obtainMessage.sendToTarget();后面再解釋
Message msg = new Message();
obtainMessage.arg1 = 0;
obtainMessage.arg2 = 1;
obtainMessage.obj = new Person("thc","cool");
obtainMessage.what = 2;
handler1.sendMessage(msg);
}</code></pre>
handler1.obtaineMessage()和new Message()的區別:
public static Message obtain() {
synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
m.flags = 0; // clear in-use flag
sPoolSize--;
return m;
}
}
return new Message();
}
從Message的源碼中可以看出,它是先從消息池中取一個消息,如果池中有消息就從池中取出一個,如果沒有就new一個Message,所以我們使用的時候使用handler.obtainMessage就可以了,節省資源。
以及handler1.post(runnable r)等:
//
public void test2() {
new Thread(new Runnable() {
@Override
public void run() {
//運行在子線程中
L.D("當前線程--->" + Thread.currentThread());
handler1.post(new Runnable() {
@Override
public void run() {
//運行在UI線程中
L.D("當前線程--->" + Thread.currentThread());
}
});
}
});
}
3.2、攔截Message
通過給Handler增加一個CallBack對消息可以對消息進行攔截。返回true攔截,返回false不攔截。
private Handler handler1 = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.what == 0){
//攔截Msg
tvTest.setText("攔截了");
return true;
}
T.show(TestHandlerActivity.this, "callBack");
return false;
}
}){
public void handleMessage(android.os.Message msg) {
T.show(TestHandlerActivity.this, "handleMessage");
};
};
3.3、remove 一個 Runnable
MyRunable mRunable = new MyRunable();
//運行一個Runnable,在運行一段時間之后讓它停止掉即:remove掉這個Runable對象
public void test3() {
handler1.postDelayed(mRunable,1000);
if(i > 3){
handler1.removeCallbacks(mRunable);
}
}
class MyRunable implements Runnable{
@Override
public void run() {
tvTest.setText("收到消息:" + i);
i++;
handler1.postDelayed(mRunable, 1000);
}
}
來自:http://www.jianshu.com/p/4311a098ebaa
本文由用戶 wdmx3331 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!