Как я могу написать собственный слушатель, который проверяет, закончился ли процесс загрузки? - PullRequest
2 голосов
/ 04 сентября 2011

Я разрабатываю приложение, которое загружает некоторую информацию из интернета.В начале приложения появляется диалоговое окно и спрашивает пользователя, хочет ли он загрузить эту информацию.Если он это делает, он запускает процесс загрузки (в другом потоке).

Это код:

Активность:

public void onCreate(Bundle savedInstanceState) 
{     
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Initialize preferences
    settings = PreferenceManager.getDefaultSharedPreferences(this);

    // Start Database
    db.open();
    db.close();

    /**Check for updates**/
    checkForDBUpdates(settings.getInt("db_version", 0));
}

private void checkForDBUpdates(int Version)
{
    // Check if Internet connection is available
    boolean online = isOnline();

    if (online) 
    {
        final UpdateNDGS update = new UpdateNDGS(this, Version);

        boolean update_status = update.check();

        if (update_status)
        {
            System.out.println("READY TO UPDATE!");

            Command updateCommand = new Command() 
            {
                public void execute() 
                {
                    update.getUpdate();
                    update.database();
                    //Download Complete, show list
                                    startNormasList();
                }
            };
            AlertDialog updateDialog = createUpdateDialog(this, updateCommand);
            updateDialog.show();
        }
        else
        {
            //Nothing to download, show list
            startNormasList();
        }
    }
    else
    {
        //offline, show list
        startNormasList();
    }
}

Все на самом деле работает, ноесли я хочу добавить функционал в будущем, он может запутаться.

Итак, мой вопрос: как я могу улучшить этот код?

Не лучше ли добавить прослушиватель, который запускает событие «Показать список», когда процесс загрузки завершен или никогда не происходит?

Как я могу это сделать?Я много читал, но не смог найти ничего полезного.

Ответы [ 3 ]

6 голосов
/ 04 сентября 2011

Наличие слушателей - это хороший способ добавить в ваш код расширяемость, а также разделить события и обработчики.Вот шаги, которые вам нужно сделать для достижения этой цели:

  • Решите, какой интерфейс должен реализовать слушатель в случае запуска события.Это включает в себя параметр, который необходимо передать обратно слушателю в случае, если сработало событие «show list».Что-то вроде (я не знаю параметров, которые вам нужны, поэтому это очень обобщенная структура)

    public interface ShowListEventLisener {
        public void onShowList(Object... params);
    }

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

    public void setOnShowListListener(ShowListEventLisener showListListener) {
       this.showListListener = showListListener;
    }

Это позволит вам добавить гибкость в случае, если вам нужно другое поведение для события "show list"

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

   if( isDownloadFinished) {
       // call the listeners with the parameters that you need to pass back
       this.showListListener.onShowList(paramsThatYouNeed);
   }

Обратите внимание, что, поскольку вы выполняете загрузку в другом потоке, вы можете использовать Handler / AsyncTask до запускасобытие.Приведенный выше пример является обобщенным, но его должно быть достаточно для того, чтобы вы могли следовать своему собственному слушателю.

2 голосов
/ 04 сентября 2011

Пожалуйста, обратитесь к

  1. DownloadManager , обрабатывает процесс загрузки и стандартные уведомления
  2. До API уровня 9 я обычно использую AsyncTask и обрабатываю все уведомления соответствующими методами

Я надеюсь, что вы хотите

2 голосов
/ 04 сентября 2011

Вы можете использовать Handler для сигнализации вашего интерфейса.

Я думаю это руководство достаточно просто.

...