我有一个从Timer启动的后台线程。该线程每60秒运行一次,可能会检测到需要应用程序立即退出的致命问题。在退出之前,我想显示一个警告对话框。因为线程每60秒运行一次,我无法知道当前正在运行哪个活动。如果没有活动,我无法调用runOnUiThread来显示警告对话框。下面是一些代码,应该说明我正在尝试做什么。在不知道当前活动的情况下,如何在UI线程上显示AlertDialog?
public class Foo {
private Timer mTimer;
public void startRefresh() {
if (mTimer == null) {
mTimer = new Timer(true);
mTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
boolean succeeded = true;
// Do something that fails
succeeded = false;
if (!succeeded) {
// Display alert dialog on UI thread before exiting application
}
}
}, 60000, 60000);
}
}
}
答案 0 :(得分:0)
将活动上下文传递给Foo构造函数
public class Foo {
Context mContext;
// constructor
public Foo(Context context){
this.mContext = context;
}
...
if (!succeeded) {
// Display alert dialog on UI thread before exiting application
}
}
public void displayAlert(Context context){
AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
alertDialog.setTitle("Display alert");
alertDialog.setMessage("My Alerts");
// Showing Alert Message
alertDialog.show();
}
<小时/> 的修改
哪项活动?整个问题是启动的Activity 检测到错误时,计时器可能不是当前活动。
然后不要使用构造函数而只使用getApplicationContext()
:
public abstract Context getApplicationContext()
在API级别1中添加返回单个全局的上下文 当前进程的应用程序对象。这通常应该只 如果你需要一个生命周期与生命周期分开的Context,就可以使用它 当前的上下文,相当于过程的生命周期 比当前的组件。
runOnUiThread(new Runnable() {
@Override
public void run() {
// Your dialog code.
}
});