Это строится на earlier question, который является PoC.Синхронизация между IntentServices и AsyncTasks
На приведенной выше схеме показана базовая установка выработок в моем приложении.
В режиме реального времени приложения, я вызов 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
сек блок пользовательского интерфейса по своей природе, какAsyncTask
get()
? Ответ PoC НЕТ, но в моем приложении реального времени обновление промежуточного прогресса не выполняется. - Как может
AsyncTask
дождаться окончанияIntentService
? - Почему отображаются журналы в
BroadcastReceiver
только послеAsyncTask
s закончен? - Это такая распространенная ситуация, есть ли наилучшая практика для преодоления этого?
Простите многословие, но надеемся, что ситуация станет ясной. Прокомментируйте, если есть двусмысленности.
Обратите внимание, что я видел, например, this answer, но, к сожалению, меня никто не устраивает.
Большое спасибо заранее!
Thanks @tyczj! Вы сказали: «Помните, что фрагмент НЕ должен разговаривать с другим фрагментом», - мои «трансляционные приемники» и «сервисные стартеры» находятся в фрагменте, поэтому фрагменты из сестры _are_ talk. Может быть, это причина, по которой я не вижу промежуточных обновлений прогресса? Стоит ли этому упражнению переместить 'BroadcastReceiver' и стартеры сервисов в« Активность »? –
Хотя я думаю, вы могли бы рассмотреть возможность использования широковещательного приемника, говорящего с двумя фрагментами, которые я не имею в виду на самом деле. Я говорю о том, что один фрагмент имеет прямую ссылку на другую, что плохо. Я лично переместил бы ваши радиоприемники в ваш холдинг-активность с IMO, что сделало бы для более чистого кода – tyczj