2013-08-20 4 views
0

У меня есть мой MainActivity, который дает пользователю список открываемых страниц, все из которых связаны с загрузкой некоторых данных из Интернета и их отображением. Чтобы сохранить пользователя в ожидании, когда они выбирают свою страницу, я сделал AsyncTask в качестве подкласса MainActivity, который создает объект DATA, когда загрузка будет завершена.Использование AsyncTask для предварительной загрузки данных для новой активности

Как бы я пройти DATA дальше к SecondActivity в следующих случаях:

  • Пользователь выбирает SecondActivityAsyncTask до завершения загрузки.
  • Загрузка завершена до того, как пользователь выберет SecondActivity.

AsyncTask не должен быть подклассом MainActivity ее просто аккуратно, чтобы сделать это таким образом до сих пор,

спасибо за помощь!

ответ

3

Вот один из способов сделать это:

Создать ссылку на ваши данные в вашем Application. Приложение Android является хорошим местом для хранения глобальных данных. Затем введите данные через вашу AsyncTask (следите за ловушками использования AsyncTask). Теперь вы можете получить доступ к своим данным с помощью вызова, подобного этому: ((MyApplication) getApplication) .mydata

Как вы упомянули, могут возникнуть два сценария. Либо данные были заполнены, либо нет. Чтобы справиться с этим, используйте наблюдателя, который отслеживает изменения данных. Регистрируйте SecondActivity в качестве наблюдателя, когда данные равны нулю. Когда данные будут доступны, ваш метод обновления SecondActivity будет вызван, и вы сможете делать все, что захотите. Наконец, обязательно отмените регистрацию от наблюдателя. Надеюсь, это поможет.

+0

Это в основном решило все мои проблемы: D спасибо! Я не уверен, что это прямое следствие этого, но если я оставлю свой эмулятор включенным приложением, а затем вернусь, он даст мне ошибку «не удалось инициализировать MyApplication». Я предполагаю, что это связано с жизненным циклом деятельности, но я не совсем уверен – Edd

1

Передача информации непосредственно между действиями работает только в том случае, если она составляет Parcellable (через Intent). Почти все может быть сделано Parcellable, но это не всегда хорошая идея, особенно когда объем данных велик.

Следующая проблема заключается в том, что ваш AsyncTask, скорее всего, сохранит Context вашего первого действия, когда он работает дольше, чем активность продолжается. Экземпляры активности часто воссоздаются при повороте устройства, и наивные реализации, как правило, запускают новую асинтезу в новом экземпляре и заканчивают несколькими задачами, загружающими одни и те же данные. Вам нужно будет передать ссылку запущенной задачи между экземплярами одного и того же Activity.

Простейшее решение, вероятно, для создания одноэлементного (или Service), доступного из обоих видов деятельности, в которых размещаются данные AsyncTask &. Если для этого требуется Context, используйте getApplicationContext(), так как это безопасно использовать вне жизни Activites. Действия могут регистрироваться как слушатели для «загруженных данных» событий, пока они активны.

0

Я недавно боролся с AsyncTask и испытывал трудности при работе с пользовательским интерфейсом, когда задача выполнялась в фоновом режиме. Хотя есть замечания по поводу того, что службы не очень подходят для описания того, что вы описываете, я нашел их намного проще в работе. Вы можете проверить intentService как среднюю площадку. Хорошо Тута можно найти here и specifically concerning intentService, here.