来自Timer线程的Android Show AlertDialog

时间:2013-12-06 20:14:18

标签: android multithreading android-alertdialog

我有一个从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);
        }
    }
}

1 个答案:

答案 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.
                }
            });