2012-06-07 59 views
0

我有一个AsyncTask从不死亡。此AsyncTask中的事件的监听者不断变化(取决于用户可见哪个活动/片段)。要做到这一点,我有这样的设置如下:Android AsyncTask - 更改监听器

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

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

现在,我的问题是有没有告知听众这种情况的任何警告?特别是,我想知道它是否是线程安全的。即如果publishProgress()registerListener()被同时调用,那么正确的听众是否会收到回叫?

回答

1

我曾经不得不调试一个AsyncTask,并且跟着我的代码进入了android的源代码。

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

如果您担心两者之间存在干扰,只需将敏感代码放入同步块中,然后放入任何变量即可。

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

为此在这两个onProgressUpdate()registerListener()和其他任何你想成为处理听者相互排斥。

1

AsyncTask不应该在活动之间生活。这不是真正正确的方法。 Android为此已有services

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

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

+0

为什么你告诉它不应该活动之间的生活? – 500865

+0

AsyncTask不是为此而设计的,它用来在一个活动中使用UI线程之外的繁重工作。它具有与活动创建者相关的onExExcute和onPostExecute方法。 服务是非常适合使用您现在使用AsyncTask的方式。 – Dmitry