Can't create handler inside thread that has not called Looper.prepare()
Activity 中創(chuàng)建了一個(gè)子線程用以請(qǐng)求HTTP吧兔,回調(diào)函數(shù)中想要更新UI鳖链,比如
Toast.make(context, message).show()
出現(xiàn)文章開(kāi)頭的錯(cuò)誤葛超,便知道是Looper的問(wèn)題
一般來(lái)說(shuō)在工作線程中執(zhí)行耗時(shí)任務(wù)瓢姻,當(dāng)任務(wù)完成時(shí)祝蝠,會(huì)返回UI。這時(shí)有兩種方法可以達(dá)到目的汹来。
一種是handler.sendMessage续膳。發(fā)一個(gè)消息,再根據(jù)消息收班,執(zhí)行相關(guān)任務(wù)代碼坟岔。
另一種是handler.post(r)。r是要執(zhí)行的任務(wù)代碼摔桦。意思就是說(shuō)r的代碼實(shí)際是在UI線程執(zhí)行的社付。可以寫(xiě)更新UI的代碼邻耕。(工作線程是不能更新UI的)鸥咖。
可參考Volley中的做法:
if(Looper.myLooper() != Looper.getMainLooper()) {
Handler mainThread = new Handler(Looper.getMainLooper());
mainThread.post(new Runnable() {
public void run() {
Request.this.mEventLog.add(tag, requestTime);
Request.this.mEventLog.finish(this.toString());
}
});
return;}