🍖🍖 作者 : 不良使
🍖🍖🍖🍖 潛力創作新星 華為雲享專家
🍖🍖🍖🍖🍖 Python+Android
🍖🍖🍖🍖🍖🍖 部落格記錄學習的思路,項目和錯誤,尋找志同道合的朋友

🍎🍎引言
handler 主要是解決同一個頁面的耗時操作。在看方法之前看一下Android中消息機制耗時操作一般不在主線程裡面進行,因為可能會造成堵塞,加載慢,程式崩潰等。在Android項目中經常有碰到這樣的問題,在子線程中完成耗時操作之後要更新UI,下面就自己經曆的一些項目總結一下更新的方法。解決主線程無法完成耗時的操作有很多。
🥭🥭1、Handler(消息機制)
🥭🥭2、runOnUiThread(在子線程中new一個主線程)
🥭🥭3、Looper
這篇文章講解Handler(消息機制)
🍎🍎handler實作
handler處理子線程無法進行耗時操作的方法就 等價于 将耗時操作通過任務的方式配置設定給别人,子線程中就執行了配置設定任務的操作(非耗時操作)。舉個例子吧,大公司做一個大項目需要很長時間,但是配置設定給子公司就不需要幹這個耗時的操作。隻需要執行把任務配置設定給子公司,子公司做完後驗收項目即可。等價于将獨立完成大項目到最後隻需要配置設定任務和稽核項目操作。
🌹🌹🌹🌹🌹🌹🌹建立處理者和消息,發送資料。
Handler handler=new Handler();
Message message=new Message();
message.what=111;
message.obj=資料;//資料可以是基本類型、對象、清單、數組等
handler.sendMessage(message);
🍓🍓🍓🍓下面對handler中一些名詞及相關進行解析。🍓🍓🍓🍓
Handler handler=new Handler();
Handler:處理者,負責Message的發送及處理。使用Handler時,需要實作handleMessage(Message msg)方法來對特定的Message進行處理,例如更新UI等。new Handler()相當于建立一個處理着。
Message message=new Message();
Message:消息,其中包含了消息ID,消息處理對象以及處理的資料等,由MessageQueue統一列隊,終由Handler處理。new Message()相當于建立一個Message對象,存儲資料為後面資料發送(任務配置設定)做準備
說到消息message,怎麼能忘掉消息隊列呢?
💕💕MessageQueue:消息隊列,用來存放Handler發送過來的消息,并按照FIFO規則執行。當然,存放Message并非實際意義的儲存,而是将Message以連結清單的方式串聯起來的,等待Looper的抽取。looper下面會說
這個相當于View.OnClickListener重寫方法onClick(View v)的v.getId(),都是
message.what=111;
。
整型
![]()
handler+message【消息機制】 下面會有使用這個,但是建議寫死在一個類裡面,便于項目管理。
message.obj=資料;//資料可以是基本類型、對象、清單、數組等
這句代碼是正真的核心,相當于把指派給這個message(消息對象),此時的資料類型可以是資料可以是基本類型、對象、清單、數組等
handler.sendMessage(message);
發送消息,将消息發送出去。
🌹🌹🌹🌹🌹🌹🌹重寫handleMessage方法,接收資料,執行耗時操作。
@Override
public boolean handleMessage(@NonNull Message msg) {
switch (msg.what){
case 111:
Toast.makeText(LoginMainActivity.this, "登陸失敗" + mEtPassWord.getText().toString().trim(), Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return false;
}
上面的handler發送消息可以根據
message.what=111;
發送不同的資料,handleMessage可以通過switch~case 區分出來。
handler有兩種方法實作,原理都一樣,一個直接new,一個調用接口。兩種方式可根據項目自己選擇。上面說的是第一種方法,但是原理是一樣的,下面總結一下
🍓🍓第一種,接口implements
發送資料
Handler handler=new Handler();
Message message=new Message();
message.what=111;
message.obj=資料;//資料可以是基本類型、對象、清單、數組等
handler.sendMessage(message);
接收資料,執行耗時操作
@Override
public boolean handleMessage(@NonNull Message msg) {
switch (msg.what){
case 111:
Toast.makeText(LoginMainActivity.this, "登陸失敗" + mEtPassWord.getText().toString().trim(), Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return false;
}
🍓🍓第二種,new個
子線程發送資料
private void updateWeather() {
new Thread(new Runnable(){
@Override
public void run() {
//耗時操作,完成之後發送消息給Handler,完成UI更新;
mHandler.sendEmptyMessage(0);
//傳遞資料
Message msg =new Message();
msg.obj = "資料";//資料可以是基本類型、對象、清單、數組等
mHandler.sendMessage(msg);
}
}).start();
}
主線程接收資料
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//拿到資料,執行耗時操作
String data = (String)msg.obj;
updateWeather();
textView.setText(data);
break;
case 1:
......
break;
...
default:
break;
}
}
};
🥭🥭2、runOnUiThread(在子線程中new一個主線程)
🥭🥭3、Looper
見下一篇文章
嗯~~,看的不盡興。*