Дизайн-шаблон для такой службы, как архитектура - PullRequest
6 голосов
/ 20 сентября 2011

Какой будет Design-Pattern, в котором существуют следующие компоненты (упрощенно):

3 компонента
- GUI
- Сборщик данных
- База данных

Design

У меня нет доступа к серверу в Интернете, это просто источник данных. Данные, которые лежат в Интернете, всегда новее, локальная база данных - это просто копия (кеш) той информации в Интернете. Графический интерфейс пользователя может запрашивать и обновлять локальный кэш, компонент, подобный сервису, затем асинхронно извлекает самые новые данные, что может занять некоторое время. Графический интерфейс показывает только данные из локальной базы данных, которые он может получать синхронно.

Итак, мой вопрос: какие классы вы бы использовали для, возможно, долгосрочной работы Service с возможностями Progressbar? Есть ли лучший дизайн для такого рода "проблемы"? Есть ли лучшие практики?

1 Ответ

1 голос
/ 20 сентября 2011

На компоненте, подобном сервису:

  • Интерфейс (метод) для запуска процесса обновления.Обычно эта служба возвращает jobId, чтобы указать задание, которое обрабатывается в фоновом режиме
  • Другой интерфейс (метод) для получения статуса на основе определенного jobId.Реализация этой службы может возвращать статус, процентCompleted или любую другую соответствующую информацию, которая сообщит вызывающему абоненту текущий статус процесса обновления.Реализация этого метода должна иметь возможность сообщать о прогрессирующем прогрессе (например, сообщать о инкрементном хранилище в локальном хранилище), чтобы создать точный индикатор выполнения, иначе лучшее, что мог бы сделать пользовательский интерфейс, - это отображать индикатор выполнения вращения.
    • Обратите внимание, что если такие инкрементные отчеты невозможно реализовать, тогда в процессе обновления, вероятно, следует использовать типичное AsyncTask использование, которое выполняет обновление в фоновом режиме и сообщает пользователю о его завершении.Если эта операция может занять некоторое время, вы можете выполнить обновление через панель уведомлений Android или push-уведомление.

Предполагая, что у вас есть интерфейс для получения прогресса обновления, вы можете использовать AsyncTask onProgressUpdate , чтобы сообщить о ходе обновления.Метод специально разработан для этого.

Ваши шаги примерно такие:

  • Выполните интерфейс для обновления через один AsyncTask.Так как ваше обновление происходит асинхронно, эта конкретная задача должна возвращаться довольно быстро с сообщением о состоянии, если выполнение выполняется успешно или не удалось, потому что какое-то исключение наряду с идентификатором задания, который выполняется в данный момент
  • , запускают другой AsyncTask, который отправляет эхо-запроссостояние обновления и сообщать о прогрессе с помощью onProgressUpdate.AsyncTask примерно выглядит как

public class GetUpdateStatusAsyncTask extends AsyncTask {
    protected Integer doInBackground(Integer... param) {
        // this is the jobId that you get from the previous AsyncTask that you use to kick off the 
        // the update process
        int jobId = param[0];
        double percentCompleted  = fetchStatus(jobId);

        while(percentCompleted != 100.00) {
            publishProgress(percentCompleted);
        }

        // return status code
        return 1;
    }

    protected void onProgressUpdate(Double... progress) {
        // set the progressBar here
    }

    protected void onPostExecute(Long result) {
       // done, handle status code
    }

    private double fetchStatus(int jobId) {
        double percentCompleted = 0.0;
        // call interface to get the update based on the jobId
        // return percentCompleted status or make a more complex object if you need 
        // more detail info
        return percentCompleted;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...