来自计时器线程的Android显示AlertDialog

来自计时器线程的Android显示AlertDialog,android,multithreading,android-alertdialog,Android,Multithreading,Android Alertdialog,我有一个从计时器开始的后台线程。该线程每60秒运行一次,可能检测到需要立即退出应用程序的致命问题。在退出之前,我想显示一个警报对话框。因为线程每60秒运行一次,所以我无法知道当前正在运行哪个活动。如果没有活动,我无法调用runOnUiThread来显示警报对话框。下面是一些代码,可以说明我要做的事情。在不知道当前活动的情况下,如何在UI线程上显示AlertDialog public class Foo { private Timer mTimer; public void sta

我有一个从计时器开始的后台线程。该线程每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);
        }
    }
}

将活动上下文传递给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();
}
编辑


什么活动?整个问题在于开始的活动 检测到错误时,计时器可能不是当前活动

然后不要使用构造函数,而是使用getApplicationContext:

公共抽象上下文getApplicationContext

API级别1中添加的返回单个全局 当前进程的应用程序对象。这通常应该仅限于 如果您需要一个生命周期与 当前上下文,它与流程的生命周期相关,而不是 而不是当前组件


什么活动?整个问题是,当检测到错误时,启动计时器的活动可能不是当前的活动。仍然有一块拼图缺失。无法从工作线程显示警报对话框;它必须显示在UI线程上。我不知道如何使用上下文在UI线程上运行某些东西。我是否错过了该类或任何其他类中的某些方法?@hairofdog是的,你是对的,你需要在runonuith中运行它阅读我的帖子只是试图快速回答你的问题
runOnUiThread(new Runnable() {
                @Override
                public void run() {
                // Your dialog code.
                }
            });