1

次のように、非同期接続を行うアクティビティがあります。

    new Thread(new Runnable() {
        public void run() {
            try{
                //Make Connection
            }catch(Exception e){
                runOnUiThread(new Runnable() { public void run() { 
                     Dialogs.showErrorDialog(MyActivity.this); //I display an error dialog using this context
                } });
            }
        }
    }).start();

接続が非常に遅く、このスレッドを開始したアクティビティを終了したとします。最終的に接続が成功した場合はすべて問題ありませんが、接続が失敗した場合は、コンテキストが存在しなくなるため、ダイアログの起動時にクラッシュします。エラーは次のとおりです。

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@4068a558 is not valid; is your activity running?

このエラーを回避するにはどうすればよいですか? 私のアクティビティがまだ生きているかどうかを検出したい

1)このコンテキストでダイアログを表示します(まだ画面にいる場合)

2) ApplicationContext でトーストを表示する (画面の外にいる場合)

編集: ダイアログ コードは次のとおりです。

static public void showErrorDialog(Context context){
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setIcon(android.R.drawable.ic_dialog_alert);
    builder.setTitle(R.string.error_title);
    builder.setMessage(R.string.error_content);
    builder.setPositiveButton(R.string.button_ok,null);
    builder.show();
}
4

2 に答える 2

2

このエラーを回避する方法は?

これを使用することをお勧めします:

runOnUiThread(new Runnable() { 
   public void run() { 
      if (!(((Activity) context).isFinishing())) { // you need to pass Context.
         Dialogs.showErrorDialog(context);      
      }
   } 
});

動作するかどうか教えてください。

注:機能しない場合は、AsyncTaskの代わりに使用することをお勧めしますrunOnUiThread()

于 2013-02-19T08:46:04.240 に答える
0

スレッドで UI を変更できません。RunOnUiThread を使用しますが、UiThread はまだスレッド内にあります。AsyncTask を使用してそれを行うことができます。

class ConnectionTask extends AsyncTask<Void, Void, Boolean> {

    protected Boolean doInBackground(Void... params) {

        //Make Connection
        boolean flag = connecting(); //flag is connect state: success or fail
        return flag;
    }

    protected void onPostExecute(Boolean result) {
        if (!result) {
            Dialogs.showErrorDialog(MyActivity.this); 
        }
    }

}

次に、次のように使用します。

ConnectionTask task = new ConnectionTask();
task.execute();
于 2013-02-19T08:41:53.590 に答える