綜上所述:這就是一個標準的的非同步操作,就像我們寄信一樣,我們只負責寫好信(Message)通過郵遞員(Handler)放入到郵箱(MessageQueue)中,由工作人員(Looper)去迴圈查詢,再由郵遞員處理(Handler)處理這些消息; //延遲兩秒跳轉 newHandler().postD ...
- Android提供了Handler和Looper來滿足線程間的通信;
- Handler和Activity的任務棧不同,它是先進先出原則;
- Handler:你可以構造Handler對象來與Looper溝通,以便push新消息到MessageQueue里,或者介面Looper從MessageQueue取出的消息;
- Looper類用來管理特定線程內對象之間交換Message;
- 一個線程可以產生一個Looper對象,由他來管理此線程的MessageQueue(消息隊列);
- MessageQueue:用來存放線程放入的消息;
- 每一個消息都需要制定的Handler來處理,通過Handler創建消息便可以完成此功能.Android引入了消息池.Handler創建消息時首先查詢消息池中是否有消息存在,如果有,則直接取出,如果沒有,則重新初始化一個消息實例.
- 使用消息池的好處是:消息不被使用時,並不作為垃圾回收,而是放入消息池中,可供下次Handler創建消息時使用.消息池提高了消息對象的復用,減少系統垃圾回收的次數.Message.obtain()來獲取消息,最大數為50;
- 綜上所述:這就是一個標準的的非同步操作,就像我們寄信一樣,我們只負責寫好信(Message)通過郵遞員(Handler)放入到郵箱(MessageQueue)中,由工作人員(Looper)去迴圈查詢,再由郵遞員處理(Handler)處理這些消息;
- 應用場景:兩秒後打開一個Activity
//延遲兩秒跳轉
newHandler().postDelayed(newRunnable(){
@Override
publicvoid run(){
Intent intent=newIntent(MainActivity.this,TestActivity.class);
startActivity(intent);
}
},2000);
- 先來看一個簡單的消息吧
privateProgressBar mProgressBar;
privateint i =0;
privateHandler mHandler =newHandler(){ // 創建Handle
@Override
publicvoid handleMessage(Message msg){
super.handleMessage(msg);
Log.i("-mHandler->",i+"");
mProgressBar.setProgress(i);
}
};
privateRunnable runnable =newRunnable(){
@Override
publicvoid run(){
Log.i("-Runnable->",i+"");
i +=10;
// 要做的事情,這裡再次調用此Runnable對象,以實現每兩秒實現一次的定時器操作
mHandler.postDelayed(runnable,2000); // 定時器
mHandler.sendMessageDelayed(Message.obtain(),0);// 發送消息才會觸發重寫的handleMessage方法
}
};
@Override
protectedvoid onCreate(@NullableBundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
mProgressBar =(ProgressBar) findViewById(R.id.pb_handler);
mHandler.post(runnable);// 開始執行線程
// runnable.run(); // 也可以用這個來開始線程
}
/**
* 刪除的時候停止線程操作
*/
@Override
protectedvoid onDestroy(){
super.onDestroy();
mHandler.removeCallbacks(runnable);
}
}
-
獲取Message的兩種方法
// 兩種獲取Message的方法
// Returns a new Message from the global message pool.
mHandler.obtainMessage()和Message.obtain()
// 兩種方法其實是一樣的,只不過一個是通過Handler獲取,一個是通過Message的靜態方法獲得,查詢Handler的源碼會發現,obtainMessage的方法構成:
publicfinalMessage obtainMessage()
{
returnMessage.obtain(this);
}
- 通過查詢源碼後發現,Message提供了諸如以下的變數
Message的recycleUnchecked()方法
void recycleUnchecked(){
// Mark the message as in use while it remains in the recycled object pool.
// Clear out all other details.
flags = FLAG_IN_USE; //int
what =0; // int
arg1 =0; // int
arg2 =0; // int
obj =null; // Object
replyTo =null; // Messenger 信使,信差
sendingUid =-1;
when =0; // long
target =null; // Handler
callback =null; // Runable
data =null; // Bundle
synchronized(sPoolSync){
if(sPoolSize < MAX_POOL_SIZE){
next = sPool;
sPool =this;
sPoolSize++;
}
}
}
mProgressBar.setProgress(msg.arg1);
privateRunnable runnable =newRunnable(){
@Override
publicvoid run(){
Log.i("-Runnable->", i +"");
i +=3;
// 要做的事情,這裡再次調用此Runnable對象,以實現每兩秒實現一次的定時器操作
mHandler.postDelayed(runnable,300);
Message msg = mHandler.obtainMessage();
msg.arg1 +=i;
mHandler.sendMessage(msg);// 發送消息才會觸發重寫的handleMessage方法
// mHandler.sendMessageDelayed(Message.obtain(),0); // 發送消息才會觸發重寫的handleMessage方法
}
};
-
重新優化下Handler
privateHandler mHandler =newHandler(){
@Override
publicvoid handleMessage(Message msg){
super.handleMessage(msg);
//Log.i("-mHandler->", i + "");
if(msg.arg1 >100){
mHandler.removeCallbacks(runnable);
}else{
mProgressBar.setProgress(msg.arg1);
}
}
};