2016-07-29 174 views
0

我的Android應用程序需要延遲後顯示對話框。問題是,當顯示對話框時,上下文可能已經改變。如何在另一個上下文中顯示對話框?

我該如何解決這個問題?

我的代碼現在看起來是這樣的:

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

相關問題