2012-06-07 135 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