(Я сожалею о том, что не был так ясен в моем первом сообщении),
Вот ситуация: у Меня есть данные, которые должны быть обновлены из Интернета. Давайте назовем его Model
.
Что я хочу сделать: В основном это походит на модель MVC, где Model
также сохранен персистентным в локальном (частном) устройстве хранения данных. Model
и его связанные методы мудры приложением. Существуют несколько Activity
тот дисплей и управляет различными аспектами его:
Activity
тот дисплей Model
с разных точек зрения. В настоящее время у меня есть a ListActivity
для всех элементов, и Activity
для деталей одного элементаModel
обновление потребностей. Конечно, это сделано на другом потоке. Обновление может быть инициировано от нескольких Activity
.Activity
Model
к частному устройству хранения данных, когда это запускается и останавливаетсяМоя проблема: я не уверен, куда поместить Model
и связанные задачи в. Кроме того, я не знаю что механизм использовать для уведомления Activity
. В настоящее время я придумываю 2 подхода:
Service
и отправьте широковещательные сообщения. Сохранение на диск выполняется в Service#onDestroyed()
, таким образом, я хочу минимизировать это путем привязки его с Activity
. На данном этапе я также не уверен, как передать обновленную информацию: обеспечить ли метод считывания в Binder
, или включайте это в широковещательное сообщение.Application
возразите так, чтобы обновляющие методы и методы считывания были доступны глобально. Я затем выполняю обновление от Activity
использование AsyncTask
. Если существуют другие Activity
это находится позади тока Activity
, они обновят в onResume()
когда пользователь перешел назад.Причины я не использую класс со статическими методами:
Model
к диску.Кроме того, я не вставляю эти технические возможности Activity
потому что существует несколько операций, которые управляют той же частью персистентных данных.
Ниже псевдокод, иллюстрирующий, что я имею в виду:
Использование сервиса:
/** Service maintaining state and performing background tasks */
class MyService extends Service {
Model mModel;
Binder mBinder;
onCreate() {
super.onCreate();
mBinder = new Binder();
// load mModel from disk, or do default initialization
}
onDestroy() {
super.onDestroy();
// save mModel to disk
}
onBind() {
return mBinder;
}
class Binder {
refresh() {
new AsyncTask() {
doInBackground() {
// update mModel from Internet
}
onPostExecute() {
sendBroadcasts(new Intent("my.package.REFRESHED"));
}
}.execute();
}
getState() {
return mModel.getState();
}
}
}
/** Activity displaying result */
class MyActivity extends ListActivity {
MyService.Binder mBinder;
onCreate() {
super.onCreate();
// register mReceiver
// bind service
}
onDestroy() {
super.onDestroy();
// unbind service
// unregister mReceiver
}
/** Invokes time-consuming update */
refresh() {
// binding is asynchronous, and user may trigger refreshing too early
if (mBinder != null) {
mBinder.refresh();
}
}
BroadcastReceiver mReceiver = new BroadcastReceiver() {
onReceive(Intent intent) {
if ("my.package.REFRESHED".equals(intent.getAction())
&& mBinder != null) {
updateViews(mBinder.getState());
}
}
};
}
Сделайте функциональность глобально доступной в объекте пользовательского приложения
/** Custom Application providing domain specific functionalities */
class MyApplication extends Application {
Model mModel;
onCreate() {
super.onCreate();
// load mModel from disk, or do default initialization
}
onTerminate() {
super.onTerminate();
// save mModel to disk
}
void refresh() {
/** time-consuming */
}
getState() {
return mModel.getState();
}
}
/** Activity displaying result */
class MyActivity extends ListActivity {
onResume() {
super.onResume();
// in case some top Activities have refreshed
// and user is navigating back
updateViews(((MyApplication)getApplicationContext()).getState());
}
/** Invokes time-consuming update */
refresh() {
new AsyncTask() {
doInBackground() {
((MyApplication)getApplicationContext()).refresh();
}
onPostExecute() {
// update the ListView according to result
updateViews(((MyApplication)getApplicationContext()).getState());
}
}.execute();
}
}
Слабые места я могу думать для Service
подход является сложностью, так как Привязка является асинхронной. И вероятно, что я должен повторить некоторый код, потому что у меня есть оба ListActivity
и Activity
Для Application
подход, в документации говорится для не доверия onTerminate()
быть названным.
Я знаю, что являюсь очень неловким. Что стандартный путь состоит в том, чтобы решить этот вид проблемы?
Большое спасибо.
Service
ы в основном подходят для чего-то, что не привязано к одной Activity
(и обычно работают вместе с NotificationManager
или Widget
). Похоже, это не тот случай.
Поэтому я предлагаю иметь хорошо спроектированную AsyncTask
, которая управляет состоянием через SharedPreferences
/SQLite
сама (вместо злоупотребления Applicaion
) и будет запускаться из ListActivity
.
Что ж, вы можете расширить BroadcastReceiver вместо Service, и когда он будет делать то, что нужно, он загружает Activity с результатами.
Вы не объяснили, какую информацию вы получаете, но эта строка важна:
Эти задачи включают состояния, требующие для корректной загрузки и сохранения, когда приложение запускается и останавливается
Если это так, почему бы вам не выполнить AsynTask
внутри Activity
?
У меня были те же проблемы с отправкой ] Намерения
с ArrayList
внутри, но у меня есть приложение, которое делает именно это, и у меня нет проблем с производительностью.