0

Это строится на earlier question, который является PoC.Синхронизация между IntentServices и AsyncTasks

enter image description here

На приведенной выше схеме показана базовая установка выработок в моем приложении.

В режиме реального времени приложения, я вызов IntentService в onOptionsItemSelected() методе Fragment, как это:

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    ... 
    ... 
    Intent myServiceIntent = new Intent(getActivity(), MyService.class); 
    getActivity().startService(myServiceIntent); 
    ... 
    ... 
} 

MyService загружает данные из облака и сохраняю их в локальную базу данных SQLite. Затем AsyncTask s в том же Fragment используют данные для обновления еще Fragment. Ключ в том, что AsyncTask должен начинать doInBackground()послеMyService.

PoC работал с Service хорошо, показывая ProgressBar и держать пользовательский интерфейс постоянно обновляется с помощью промежуточных результатов BroadcastReceiver с. Обратите внимание: Service был вызван от AppCompatActivity, но в реальном приложении его вызвали от Fragment. Точная настройка не работает, нет ProgressBar, никаких промежуточных обновлений. Журнальные сообщения от BroadcastReceiver s отображаются послеAsyncTask s завершены.

Рассматриваются вопросы, то есть,

  • ли IntentService сек блок пользовательского интерфейса по своей природе, как AsyncTaskget()? Ответ PoC НЕТ, но в моем приложении реального времени обновление промежуточного прогресса не выполняется.
  • Как может AsyncTask дождаться окончания IntentService?
  • Почему отображаются журналы в BroadcastReceiverтолько послеAsyncTask s закончен?
  • Это такая распространенная ситуация, есть ли наилучшая практика для преодоления этого?

Простите многословие, но надеемся, что ситуация станет ясной. Прокомментируйте, если есть двусмысленности.

Обратите внимание, что я видел, например, this answer, но, к сожалению, меня никто не устраивает.

Большое спасибо заранее!

ответ

1

Do IntentServices блокируют пользовательский интерфейс от природы, например AsyncTask get()? не

Нет у них нет, то есть весь смысл в IntentService, чтобы делать вещи в фоновом режиме

Как может AsyncTask ждать, пока в IntentService закончил?

Существует несколько способов, но простой способ заключается в использовании BroadcastReceiver в вашей деятельности, которая содержит фрагмент и активирует действие для обновления фрагмента/s. Помните, что фрагмент НЕ должен разговаривать с другим фрагментом, ваша деятельность должна быть одной делегирующей информацией между фрагментами.

почему ваш BroadcastReceiver не работает в вашем реальном приложении. Я не могу ответить с информацией, которую вы можете просто потерять, когда вы ее измените. Я использую BroadcastReceivers с IntentServices все время без проблем

+0

Thanks @tyczj! Вы сказали: «Помните, что фрагмент НЕ должен разговаривать с другим фрагментом», - мои «трансляционные приемники» и «сервисные стартеры» находятся в фрагменте, поэтому фрагменты из сестры _are_ talk. Может быть, это причина, по которой я не вижу промежуточных обновлений прогресса? Стоит ли этому упражнению переместить 'BroadcastReceiver' и стартеры сервисов в« Активность »? –

+1

Хотя я думаю, вы могли бы рассмотреть возможность использования широковещательного приемника, говорящего с двумя фрагментами, которые я не имею в виду на самом деле. Я говорю о том, что один фрагмент имеет прямую ссылку на другую, что плохо. Я лично переместил бы ваши радиоприемники в ваш холдинг-активность с IMO, что сделало бы для более чистого кода – tyczj

0

Спасибо @tyczj за четкие и лаконичные ответы!

Просто формально завершить ...

Почему журналы в BroadcastReceiver отображаются только после AsyncTasks закончили?

Хотя неясно, это была моя ошибка, дух. (Только) отладка.

Это такая распространенная ситуация, есть ли наилучшая практика для преодоления этого?

Лучшая практика ИМХО, практиковать. Тем не менее, это точки я понял (твердый путь):

  • IntentService над AsyncTask на фоне работы более 5 секунд
  • LocalBroadcastManager с BroadcastReceiver, чтобы показать информацию о ходе работ от IntentService и сделать другие более быстрые фоновые потоки ждать на.
Смежные вопросы