前言
最近一段時間在忙著開發(fā)一款自己的APP,將自己常用的功能需求都加入進入,同時在GitHub上跟著大牛們學習新的技術(shù)检痰,提升自己的技能,在開發(fā)的過程中不斷的發(fā)現(xiàn)問題和解決問題锨推。
在開發(fā)過程遇到了這樣一個問題:Can't toast on a thread that has not called Looper.prepare()
铅歼,如果在一個線程中沒有調(diào)用Looper.prepare(),就不能在該線程中創(chuàng)建Toast。這個問題是因為在子線程中彈出Toast導致的换可。
Android是不能直接在子線程中彈出Toast的椎椰,可是如果我們非要這么做,那該怎么辦呢沾鳄?下面就為大家講解如何在子線程中彈出Toast慨飘,以及一些其他類似的子線程中操作的錯誤。
本博客同步發(fā)布于XueLong的博客
在子線程中調(diào)用Toast
在子線程中彈出Toast译荞,會報錯:java.lang.RuntimeException: Can't toast on a thread that has not called Looper.prepare()瓤的。
解決方式:先調(diào)用Looper.prepare();
再調(diào)用Toast.makeText().show();
最后再調(diào)用Looper.loop();
public class ToastUtils {
static Toast toast = null;
public static void show(Context context, String text) {
try {
if(toast!=null){
toast.setText(text);
}else{
toast= Toast.makeText(context, text, Toast.LENGTH_SHORT);
}
toast.show();
} catch (Exception e) {
//解決在子線程中調(diào)用Toast的異常情況處理
Looper.prepare();
Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
Looper.loop();
}
}
}
在子線程中更新UI
在子線程中更新UI,會報錯:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
解決方式:在子線程中更新UI吞歼,一般使用Handler或者runOnUiThread()或者AsyncTask圈膏。
在子線程中創(chuàng)建Handler
在子線程中創(chuàng)建Handler,會報錯:java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()篙骡。
解決方式:
new Thread() {
public void run() {
Looper.prepare();
new Handler().post(runnable);//在子線程中直接去new 一個handler
Looper.loop(); //這種情況下稽坤,Runnable對象是運行在子線程中的丈甸,可以進行聯(lián)網(wǎng)操作,但是不能更新UI
}
}.start();
寫在最后
以上就是在子線程中更新UI尿褪、彈出Toast睦擂、創(chuàng)建Handler時會遇到的問題,及解決方式杖玲。
如果你在參考過程中遇到問題顿仇,可以在我的聯(lián)系方式中給我提問。
后面會繼續(xù)介紹摆马,Android的相關(guān)知識夺欲,歡迎繼續(xù)關(guān)注我博客的更新。
參考資源
- 在子線程中new Handler報錯
- Android -- Looper.prepare()和Looper.loop() —深入版
- Toast和Looper今膊、Handler消息循環(huán)機制
轉(zhuǎn)載請注明:XueLong的博客 ? Can't toast on a thread that has not called Looper.prepare()