我有一个永远不会死的AsyncTask
。此AsyncTask
中事件的监听器不断变化(取决于用户可见的活动/片段)。为实现这一目标,我有如下设置:
public interface TaskListener { public void onItemChanged(String itemName) }
TaskListener
成员变量。public void registerListener(TaskListener listener) { mListener = listener; } public void unregisterListener() { mListener = null; }
onPublishProgress()
的{{1}}方法(通过publishProgress()
方法doInBackground()
中调用)中,我通知了听众。现在,我的问题是,在通知听众时,是否有任何警告?特别是,我想知道它是否是线程安全的。即,如果同时调用AsyncTask
和publishProgress()
,正确的侦听器是否会收到回调?
答案 0 :(得分:1)
我曾经不得不调试AsyncTask并且跟着我的代码甚至进入了android的源代码。
publishProgress()
不会直接调用onProgressUpdate()
它只是在队列中发布消息,队列处理程序最终会调用onProgressUpdate()
。
严格来说,如果publishProgress()
和registerListener()
同时被调用,registerListener()
将首先到达那里。
如果您担心两者之间的干扰,只需将敏感代码包含在同步块中的任何变量上。
synchronized(mListener) {
// do stuff to mListener
}
在onProgressUpdate()
和registerListener()
以及您希望在处理侦听器时互斥的任何其他位置执行此操作。
答案 1 :(得分:1)
AsyncTask
不应该介于活动之间。这不是真正正确的方式。
Android已为此services
。
http://developer.android.com/reference/android/app/Service.html
http://developer.android.com/guide/developing/tools/aidl.html