![](/img/trans.png)
[英]Can not create handler inside thread that has not called Looper.prepare()
[英]Handler or runOnUiThread solution for “Can't create handler inside thread that has not called Looper.prepare() ”
最近,我在用戶線程中出現了一個toast並得到了上面的運行時錯誤。
從無法在未調用Looper.prepare()的線程內創建處理程序 ,他們建議使用Handler
作為解決方案。 但是,我看到解決方案非常冗長和繁瑣。
我自己的解決方案是使用runOnUiThread
private void showTooDarkToastMessage()
{
((Activity) this.getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
Toast toast = Toast.makeText(getContext(), getResources().getString(R.string.toast_toodark), Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
}
});
}
我想知道,與Handler
相比,使用runOnUiThread
有什么缺點嗎?
因為您正在顯示UI元素(Toast消息),所以runOnUiThread是完美的。
Handler將在指定的線程上運行其任務。 例如,
protected void onCreate( Bundle savedInstanceState )
{
Handler hander = new Handler();
//Create thread, post to handler
}
將創建一個新的Handler,它將在UI線程上運行其帖子。 調用Activiy.runOnUiThread只是將runnable專門發布到UI線程。 默認情況下,處理程序將在它們創建的任何線程上運行。上面的代碼與使用runOnUiThread相同,因為onCreate方法在UI線程上運行!
如果您需要在多個后台線程之間進行通信,則首選處理程序。
由於移動設備的資源有限,因此在UI線程上運行的工作應保持相對較輕。 在UI線程上進行的大量工作可能導致應用程序無響應(ANR)錯誤,並可能導致操作系統終止您的進程。
實際上runOnUiThread()
使用Handler
里面。 因此,如果您想簡單地在UI線程中發布一些工作,那么使用runOnUiThread()
沒有任何缺點。
如果你對Handler
和runOnUiThread()
之間的區別感興趣,你可以在這個答案中閱讀它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.