子執行緒中Toast

2021-06-28 16:13:11 字數 1210 閱讀 9274



那天和同學在討論乙個小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...