那天和同學在討論乙個小demo,無意間,在子執行緒中toast了一把,竟然報錯了
因為toast在service和activity中都可以執行。所以開始就認為和ui執行緒沒有有太大的關係,而現在子執行緒toast竟然報錯!無奈之下,花了半天的時間看了一下handler,looper,toast的原始碼,終於搞定了。(這個效率..本人愚鈍啊)----->的確和ui執行緒沒有關係
記錄下來,希望對遇上同樣問題的同學有所幫助。下面正題
1、錯誤的關鍵位置在於toast初始化的時候,這句
public class toast
2、其實在別的地方也看到過,普通執行緒不能直接new乙個handler
原因:public handler()
…..}
3、而looper中
public static final looper mylooper()
而事實上子執行緒只是乙個普通的執行緒,其threadloacl中沒有設定過looper,所以會丟擲異常
4、解決方法
public voidonclick(view v) ;
}.start();
}looper.prepare()方法參考
//looper
public static final voidprepare()
sthreadlocal.set(newlooper());
}下邊的可以忽略了
5、至於內部的通訊機制就不知道了
只知道show()方法裡邊呼叫了inotificationmanager. enqueuetoast(pkgname, tn, mduration)
其中tn是繼承了itransientnotification.stub的遠端通訊介面,而handler也是在這個tn類中呼叫!猜想內部機制也是notificationservice的程序間通訊機制!
下邊**,算是管中窺豹吧
-----原始碼不是這個樣子的,被我概括
itransientnotification中有個show方法
public voidshow()
其中mshow是
finalrunnable mshow =newrunnable() };
在子執行緒中Toast
問題 直接在普通子執行緒中toast會報錯 錯誤關鍵 1.普通的執行緒不能直接new乙個handle,而toast初始化 中如下 片 public class toast 2.為什麼普通執行緒不能new乙個handle?handle類 如下 public handler looper類中的 片段 p...
可在子執行緒中使用的Toast
one goal,one passion 一般我們使用taost時必須在主線程中,可是如果我們想在子執行緒中使用是就不是那麼方便了.因為系統的toast在子執行緒中使用會報錯.下面我們做一些處理,就可以實現在子執行緒中使用toast.public class myutils else 1,如果執行緒...
在子執行緒中直接使用 Toast 及其原理
一般我們都把toast當做乙個ui控制項在主線程顯示。但是有時候非想在子執行緒中顯示toast,就會使用handler切換到主線程顯示。但是子執行緒中真的不能直接顯示toast嗎?答案是 當然可以。那應該怎麼操作呢?在當前執行緒中先初始化乙個looper即可!looper.prepare toast...