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