簡體   English   中英

Handler或runOnUiThread解決方案“無法在未調用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()沒有任何缺點。

如果你對HandlerrunOnUiThread()之間的區別感興趣,你可以在這個答案中閱讀它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM