https://blog.csdn.net/weixin_41101173/article/details/79701832
首先,post和postDelay都是Handler的方法,用以在子線程中發送Runnable對象的方法;
其次,Android中post()方法可以直接在非UI線程中更新UI,不同與Handelr的Send類方法,需要進行切換;
最后,兩個方法在實現UI線程事件的時間上有所區別,postDelayed()方法用以延期執行,post則是立即執行;
(2)Handler類的post類方法和send類方法聯系與區別
①post類方法,以匿名內部類的形式發送Runnable對象,在Runnable對象重寫的run()方法中直接對UI進行更新;
new Thread(new Runnable() {
@Override
public void run() {
/**
耗時操作
*/
handler.post(new Runnable() {
@Override
public void run() {
/**
更新UI
*/
}
});
}
}).start();
---------------------
作者:Chin_style
來源:CSDN
原文:https://blog.csdn.net/weixin_41101173/article/details/79701832
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
三種切回主線程的實例:
final Handler handler = new Handler();
new Thread(new Runnable() {
@Override
public void run() {
// 素描算法處理 耗時操作
final Bitmap bitmap1 = SketchUtil.testGaussBlur(finalBitmap,1,1);
final Bitmap bitmap2 = SketchUtil.testGaussBlur(finalBitmap,10,10);
final Bitmap bitmap3 = SketchUtil.testGaussBlur(finalBitmap,20,20);
// 三種切回主線程更新UI的方法
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap1); // 素描圖
}
});
runOnUiThread(new Runnable() {
@Override
public void run() {
orignView.setImageBitmap(bitmap2); // 素描圖
}
});
handler.post(new Runnable() {
@Override
public void run() {
threeView.setImageBitmap(bitmap3); // 素描圖
}
});
}
}).start();
---------------------
作者:Chin_style
來源:CSDN
原文:https://blog.csdn.net/weixin_41101173/article/details/79701832
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
注意:使用handler方法切回主線程時,注意handler的實例化要放在主線程中,而不能在新開的子線程中,否則報錯:
RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
這是因為,Handler在哪里創建,就獲得哪里的Looper。主線程創建的Handler,即默認使用主線程的Looper。
常見常用的post()類方法匯總:
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
②send類方法,比如sendMessage()方法,使用該方法發送構造好的Message,然后用Handler的handleMessage()方法接收發送出來的消息,在方法中對UI進行更新;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) { //判斷標志位
case 1:
/**
獲取數據,更新UI
*/
break;
}
}
};
public class WorkThread extends Thread {
@Override
public void run() {
super.run();
/**
耗時操作
*/
//從全局池中返回一個message實例,避免多次創建message(如new Message)
Message msg =Message.obtain();
msg.obj = data;
msg.what=1; //標志消息的標志
handler.sendMessage(msg);
}
}
常見常用的send類方法匯總:
---------------------
作者:Chin_style
來源:CSDN
原文:https://blog.csdn.net/weixin_41101173/article/details/79701832
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
常見常用的send類方法匯總:
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
分析:谷歌為Android系統提供了一系列的post類方法用以發送Runnable對象,又提供了一系列的send類方法用以發送Message對象,其實二者並不矛盾也不重復,打開post類方法的源碼,就會發現最終發送的Runnable對象也會轉變成Message對象進行發送。谷歌提供兩類方法應該是分別處理不同的場景,發送的消息較為復雜時,且每種消息對應一種UI的更新時選擇使用send類方法;而當子線程中只發出一種消息時,則直接使用post方法發送消息,且直接在post方法的內部實現UI的更新。
(3)Message的構造
public final class Message implements Parcelable {
public int what;
public int arg1;
public int arg2;
public Object obj;
...
}
Message類中有這幾個成員變量描述消息,其中what是我們定義的消息碼,為了讓接收者能知道消息是關於什么的。arg1和arg2用於發送一些integer類型的值。obj用於傳輸任意類型的值。
---------------------
作者:Chin_style
來源:CSDN
原文:https://blog.csdn.net/weixin_41101173/article/details/79701832
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
⑦Looper的工作原理:Looper在Android的消息機制中扮演着消息循環的角色,具體來說就是它會不停地從MessageQueue中查看是否有新消息,如果有新消息就會立刻處理,否則就一直阻塞在那里。注意關注一些重要的Looper的方法:
Looper.prepare()-為當前線程創建一個Looper;
Looper.loop()-開啟消息循環,只有調用該方法,消息循環系統才會開始循環;
Looper.prepareMainLooper()-為主線程也就是ActivityThread創建Looper使用;
Looper.getMainLooper()-通過該方法可以在任意地方獲取到主線程的Looper;
Looper.quit() Looper.quitSafely()-退出Looper,自主創建的Looper建議在不使用的時候退出
⑧ActivityThread主線程通過ApplicationThread和AMS進行進程間通信
---------------------
作者:Chin_style
來源:CSDN
原文:https://blog.csdn.net/weixin_41101173/article/details/79701832
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!