2011-12-16 6 views
2

-java.lang.RuntimeExceptionのようなエラーが発生しました:Looper.prepare()を呼び出していないスレッド内でハンドラを作成できません非UIクラスから警告ダイアログを表示するにはどうすればよいですか? Looper.prepare()を呼び出していないスレッド内でハンドラを作成できません

私は多くの活動をしているceratingアプリケーションです。ユーザーが特定の時間(15分)応答しなかった場合、15分後に、ユーザーに「まだそこにいますか?」という質問を表示するダイアログボックスが表示されます。ユーザーが「いいえ」を押すとアプリケーションが終了するはずです。 私は Application idle time

の助けを借りてこれを実行しようとしましたが、私は私の各アクティビティからControlApplication.javaを I直接呼び出すタッチ()は作成されませんでした。 私のアプリケーション用にグローバルな別の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を更新しようとしている場合にのみ、HandlerまたはrunOnUiThread()を使用しなければならないUIスレッドからUIを更新する必要があります。

killContext.runOnUiThread(new Runnable() { 

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

どこに書きますか? – shankey

+0

run()内でダイアログを表示する場所(UIを更新)。 –

+1

私はしようとするが、どのように活動名を取得するか? – shankey

1

AlertDialog、これを試してみては、現在の活動を除いて、任意のコンテキストで表示することはできません。だから、killContextActivityクラスを拡張していることを確認しなければなりません。

0
  • 最も良い方法はAsyncTaskです。

  • ショートウェイはR unOnUiThread(new runnable)を呼び出し、実行可能な内部にアラートダイアログ関連の書き込みを行います。

  • 代替方法Handlerクラスの実装

+0

私は短い方法で行きたいと思いますが、RunOnUiThread(新しい実行可能ファイル)はどこに書き込むべきですか?私はこれに非常に新しいですので、詳しく説明してください。 – shankey

+0

新しいことは不公平ではありませんが、実際にはドキュメントを参照して勉強しても助けてください。 –

0

あなたは、あなたがrunOnUiThreadを呼び出すことができ、代わりにkillContext分野におけるコンテキストの活性を保存する必要があります。

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

アクティビティを取得してkillContextに格納する方法はありますか? – shankey

0

私があればということも観察していますプロセスが非UIスレッドに置かれ、runOnUiThreadなしでアラートが発生すると、何らかのハングが発生し、アンドロイドUIスレッドがANRになります。誰もが同じ観察をしていますか?

関連する問題