Android AsyncTask - 更改侦听器

时间:2012-06-07 14:25:00

标签: android thread-safety android-asynctask

我有一个永远不会死的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()的{​​{1}}方法(通过publishProgress()方法doInBackground()中调用)中,我通知了听众。

现在,我的问题是,在通知听众时,是否有任何警告?特别是,我想知道它是否是线程安全的。即,如果同时调用AsyncTaskpublishProgress(),正确的侦听器是否会收到回调?

2 个答案:

答案 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