MVC в Android: Приложение или Сервис для асинхронных обновлений?

(Я сожалею о том, что не был так ясен в моем первом сообщении),

Вот ситуация: у Меня есть данные, которые должны быть обновлены из Интернета. Давайте назовем его 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() быть названным.

Я знаю, что являюсь очень неловким. Что стандартный путь состоит в том, чтобы решить этот вид проблемы?

Большое спасибо.

6
задан Phil 3 July 2010 в 16:00
поделиться

3 ответа

Serviceы в основном подходят для чего-то, что не привязано к одной Activity (и обычно работают вместе с NotificationManager или Widget). Похоже, это не тот случай.
Поэтому я предлагаю иметь хорошо спроектированную AsyncTask, которая управляет состоянием через SharedPreferences/SQLite сама (вместо злоупотребления Applicaion) и будет запускаться из ListActivity.

1
ответ дан 17 December 2019 в 22:10
поделиться

Что ж, вы можете расширить BroadcastReceiver вместо Service, и когда он будет делать то, что нужно, он загружает Activity с результатами.

0
ответ дан 17 December 2019 в 22:10
поделиться

Вы не объяснили, какую информацию вы получаете, но эта строка важна:

Эти задачи включают состояния, требующие для корректной загрузки и сохранения, когда приложение запускается и останавливается

Если это так, почему бы вам не выполнить AsynTask внутри Activity ?

У меня были те же проблемы с отправкой ] Намерения с ArrayList внутри, но у меня есть приложение, которое делает именно это, и у меня нет проблем с производительностью.

0
ответ дан 17 December 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: