2016-07-29 1 views
0

私のアンドロイドアプリは遅れてダイアログを表示する必要があります。問題は、ダイアログが表示されるまでにコンテキストが変更されている可能性があることです。別のコンテキストでダイアログを表示するにはどうしたらいいですか?

どうすればこの問題を解決できますか?

は私のコードは今のようになります。

class UpdateRunnable extends Runnable { 
    private Context ctx; 
    UpdateRunnable(Context ctx) { 
     this.ctx = ctx 
    } 
    @Override 
    public void run() { 
     //throws exception: "Unable to add window -- token null is not for an application" 
     AlertDialog.Builder builder = new AlertDialog.Builder(ctx.getApplicationContext()); 
     builder.setTitle("Time to refresh data"); 
     builder.setMessage("Data needs updating"); 
     builder.show(); 
    } 
} 

class MyAvtivity extends AppCompatActivity { 
    @override 
    public void onCreate(...) { 
     Handler updateHandler = new Handler(); 
     updateHandler.postDelayed(new UpdateRunnable(this), 10000); 

     //do some stuff 
     //start another activity 
    } 
} 

答えて

1

AlertDialog.BuilderはApplicationContextのでは動作しません。そのため、悪質なトークン例外が発生しています。

runnableのコンテキストが現在のアクティビティコンテキストであることを確認する必要があります。あるいは、ダイアログを内部に表示するロジックを持つサービスを使用するような別のアプローチを試して、現在のアクティビティDialog.ThemeでAlertDialogを使用する代わりに、ダイアログを表示するか、サービスを使用してアクティビティを開始する必要があります。

0
private Context ctx; 
UpdateRunnable(Activity activity) { this.activity = activity } 

@Override public void run() { 
    if(!activity.isFinishing()){ 
     AlertDialog.Builder builder = new AlertDialog.Builder(activity); 
     builder.setTitle("Time to refresh data"); 
     builder.setMessage("Data needs updating"); 
     builder.show(); 
    } 
} 
+0

これは例外をスローしませんが、ダイアログが表示されません(表示されていないアクティビティに表示しようとしているため) – B1CL0PS

関連する問題