Android自定义守护程序UI线程

时间:2011-09-20 16:16:56

标签: android multithreading user-interface

我必须创建自定义守护程序UI线程,如果后端有任何更新,则显示对话框(为了更容易,我们假设对话框应该每1分钟显示一次)。我有BaseActivity,它是我的应用程序中每个活动的父级。应该在我的任何活动中显示对话框。我还有我的自定义SSAApplication类,它扩展了Application。所以,我希望我的UI线程成为SSAApplication类的静态字段,并且该线程可以通过应用程序启动和停止。我想在我的情况下应该使用Handler,但我不知道如何。问题是我无法理解如何从这个线程中显示对话框。那么,有人能解决我的问题吗?

1 个答案:

答案 0 :(得分:1)

除UI线程外,您无法从任何位置显示对话框。这实际上是个好消息:如果可以的话,你会花很多时间调试不可复制的问题!

您需要做的是,正如您所猜测的那样,从后台线程向您的前端活动报告,并让他们完成UI工作。

在后台线程开始工作之前,将其交给一个回调接口:

public interface SomeListener {
    public void onSomethingDone(Object result);
}

假设您想要启动此线程,并在有数据时通知您(而不是每次都请求数据)。基本的(未经展示的,丑陋的)方法将是这样的:

/* In your Activity */

private Handler mHandler = new Handler();

public void startBackgroundWork() {
    new WorkingThread(new SomeListener() {
        public void onSomethingDone(Object result) {

            mHandler.post(new Runnable() {
                public void run() { showMyDialog(result); }
            }

        }    
    }).start();
}

然后,当然

public class WorkingThread extends Thread {
    private SomeListener mListener;

    public WorkingThread(SomeListener listener) {
        mListener = listener;
    }

    public void run() {
        /* do some work */
        mListener.onSomethingDone(result);
    }
}

这样,你的线程调用一个函数,确保从Activity的线程中显示对话框。

然而,您可能会遇到其他类型的问题。这不是处理此问题的100%正确方法。有关更多信息,请参阅此博客文章:

http://blogactivity.wordpress.com/2011/09/01/proper-use-of-asynctask/