2011-12-16 27 views
2

獲取錯誤,如-java.lang.RuntimeException:無法在未調用Looper.prepare()的線程中創建處理程序如何顯示來自非UI類的警報對話框?出現錯誤 - 不能在線程內創建沒有調用Looper.prepare()的處理程序()

我正在開展許多活動的申請。如果用戶沒有響應特定的時間(15分鐘),那麼在15分鐘後,我將顯示一個對話框,詢問用戶「你還在嗎?」如果用戶按「否」應用程序應該關閉。 我試着用的 Application idle time

幫助做到這一點,但我沒有從我的每個活動創建ControlApplication.java 我直接調用觸摸()。 並從我的應用程序全局的另一個java文件中調用Waiter類構造函數。 這裏是我的代碼
Waiter.java

public class Waiter extends Thread 
{ 
private static final String TAG=Waiter.class.getName(); 
private long lastUsed; 
private long period; 
private boolean stop; 
private Context killContext; 

public Waiter(long period, Context context) 
{ 
    this.period=period; 
    stop=false; 
    killContext = context; 
} 

public void run() 
{ 
    long idle=0; 
    this.touch(); 
    do 
    { 
     idle=System.currentTimeMillis()-lastUsed; 
     Log.d(TAG, "Application is idle for -------------------------------------->"+idle +" ms"); 
     Log.d(TAG, "lastUsed is -------------------------------------->"+lastUsed +" ms"); 
     Log.d(TAG, "currentTimeMillis is -------------------------------------->"+System.currentTimeMillis() +" ms"); 
     try 
     { 
      Thread.sleep(5000); //check every 50 seconds 
     } 
     catch (InterruptedException e) 
     { 
      Log.d(TAG, "----------------Waiter interrupted!-----------------------------------"); 
     } 
     if(idle > period) 
     { 
      idle=0; 
      Log.d(TAG, "----------------inside if-----------------------------------"); 
      AlertDialog.Builder killBuilder = new AlertDialog.Builder(killContext);      
      killBuilder.setMessage("Are you still there ?") 
       .setCancelable(false) 
       .setPositiveButton("Yes", 
        new DialogInterface.OnClickListener() 
        { 
         public void onClick(DialogInterface dialog, int id) 
         { 
          dialog.cancel(); 
         } 
        }) 
        .setNegativeButton("No", 
         new DialogInterface.OnClickListener() 
        { 
         public void onClick(DialogInterface dialog, int id) 
         { 
          android.os.Process.killProcess(
           android.os.Process.myPid()); 
         } 
        }); 
      Log.d(TAG, "----------------inside if killBuilder.create();;-----------------------------------"); 
      AlertDialog alert = killBuilder.create(); 
      Log.d(TAG, "----------------inside if alert.show();-----------------------------------"); 
      alert.show(); 
     } 
    } 
    while(!stop); 
    Log.d(TAG, "--------------------------------Finishing Waiter thread-----------------------------"); 
} 

public synchronized void touch() 
{ 
    lastUsed=System.currentTimeMillis(); 
} 

public synchronized void forceInterrupt() 
{ 
    this.interrupt(); 
} 

public synchronized void setPeriod(long period) 
{ 
    this.period=period; 
} 

}

但alert.show();我得到以上錯誤。請幫忙。

回答

1

問題是,您正在嘗試從非UI線程更新UI,您應該從UI線程更新UI,否則您必須使用HandlerrunOnUiThread()

嘗試此,

killContext.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       alert.show(); 
      } 
     }); 
+0

我應該在哪裏寫這個? – shankey 2011-12-16 13:18:43

+0

裏面運行()你想要顯示對話框(更新UI)。 – 2011-12-16 13:20:08

+1

好吧,我會嘗試,但如何獲得活動的名稱? – shankey 2011-12-16 13:22:59

1

AlertDialog不能在任何上下文中示出,除了當前活動。所以你必須確保killContext延伸Activity類,它現在在屏幕上寫。

0
  • 最好的辦法是AsyncTask

  • 簡短的方法是調用R unOnUiThread(new runnable)並在runnable裏面寫入alert對話框相關的東西。

  • 替代方式Handler類實現

0

,可以儲存的活動,而不是在killContext領域的背景下,那麼你可以撥打runOnUiThread

killActivity.runOnUiThread(new Runnable(){public void run(){alert.show();}}) 
0

我也觀察到,如果一個進程放在非ui線程上,並且它在沒有runOnUiThread的情況下引發警報,它會導致某種掛起,並且android ui線程會進入ANR ...任何人都有這種相同的觀察結果?

相關問題