2012-06-07 4 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 не предназначен для этого, он намерен использовать внутри одного действия для выполнения тяжелой работы вне потока пользовательского интерфейса. Он имеет методы onPreExecute и onPostExecute, которые связаны с создателем активности. Услуги exaccty предназначены для использования так, как вы используете AsyncTask прямо сейчас. – Dmitry

Смежные вопросы