如何在其他上下文中显示对话框?

时间:2016-07-29 16:26:50

标签: android multithreading android-alertdialog

我的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
    }
}

3 个答案:

答案 0 :(得分:1)

AlertDialog.Builder不能与ApplicationContext一起使用。这就是为什么你得到一个坏的令牌例外。

因此,您需要确保runnable的上下文是您当前的活动上下文,或尝试使用不同的方法,例如使用具有何时显示内部对话框的逻辑的服务,并使其通知当前活动它应显示对话框,或使用服务以Dialog.Theme启动活动,而不是使用AlertDialog。

答案 1 :(得分:0)

你试过ContextWrapper吗?

答案 2 :(得分: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(); 
    }
}