0

我有一个AsyncTask永远不会死的。在此事件的侦听AsyncTask器不断变化(取决于用户可见的活动/片段)。为此,我有如下设置:

  • 一个接口:
public interface TaskListener {
   public void onItemChanged(String itemName)
}
  • AsyncTask 包含一个TaskListener使用公共方法注册/注销的成员变量。
public void registerListener(TaskListener listener) {
    mListener = listener;
}

public void unregisterListener() {
    mListener = null;
}
  • onPublishProgress()方法(方法中调用via )中publishProgress(),我通知了监听器。doInBackground()AsyncTask

现在,我的问题是在通知听众时对这种情况有什么警告吗?特别是,我想知道它是否是线程安全的。即,如果publishProgress()同时registerListener()调用 和 ,正确的侦听器会收到回调吗?

4

2 回答 2

1

我曾经不得不调试一个 AsyncTask 并按照我的代码甚至进入了 android 的源代码。

publishProgress()不会直接调用onProgressUpdate()它,只是在队列中发布消息,队列处理程序最终会调用onProgressUpdate().
所以严格来说,如果publishProgress()registerListener()被同时调用registerListener()将首先到达那里。

如果您担心两者之间的干扰,只需将敏感代码包含在同步块中,而不是那里的任何变量。

synchronized(mListener) {
    // do stuff to mListener
}

在您希望在处理侦听器时相互排斥的任何地方和任何地方都onProgressUpdate()这样做。registerListener()

于 2012-06-07T14:35:04.703 回答
1

AsyncTask不应该在活动之间生活。这不是真正正确的方法。安卓有services这个。

http://developer.android.com/reference/android/app/Service.html

http://developer.android.com/guide/developing/tools/aidl.html

于 2012-06-07T14:37:45.110 回答