我的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
}
}
答案 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();
}
}