如何在另一个上下文中显示对话框?

How can I show a dialog on another context?

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

AlertDialog.Builder 不适用于 ApplicationContext。这就是为什么您会收到错误的令牌异常。

所以你需要确保你的runnable的上下文是你当前的activity上下文,或者尝试不同的方法,比如使用一个服务,其逻辑是什么时候在里面显示对话框,并让它通知当前 activity 它应该显示对话框,或者使用服务启动带有 Dialog.Theme 的 activity 而不是使用 AlertDialog。

你试过 ContextWrapper 了吗?

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(); 
    }
}