Пользовательский изменяемый обработчик, когда Служба заканчивает загрузку файла - PullRequest
1 голос
/ 30 мая 2010

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

Таким образом, в основном пользователь API мог бы подключать различные обработчики для ответа, некоторые могли бы анализировать XML, другие могли бы сохранять файлы и т. Д.

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

Как я могу это сделать?

ОБНОВЛЕНИЕ - у меня была одна идея, что она будет работать вроде как, но есть проблема, если DownloadRunnable изменяется между выполнением загрузок.

Модифицированный интерфейс Runnable

interface DownloadRunnable {
    void run(InputStream stream);
}

Перечисление

public enum ServiceHandler {
    DOWNLOAD_HANDLER;

    private DownloadRunnable handler=null;

    /**Called from the Service*/
    public void doHandler(InputStream stream) {
        if(handler==null) throw new IllegalStateException("You must set the handler first: setDownloadHandler()");
        this.handler.run(stream);
    }

     /**Set before theservice runs*/
     public void setHandler(DownloadRunnable r) {
         this.handler = r;
     }
}

Клиент может установить, что происходит для каждого перечисления

ServiceHandler.DOWNLOAD_HANDLER.setHandler(new DownloadRunnable() {

        @Override
        public void run(InputStream stream) {
            // The user can do anything they want with the stream
        }
    });

Служба запускает это, когда доступен входной поток

ServiceHandler.DOWNLOAD_HANDLER.doHandler(stream);

Это работает, но не так элегантно.

  1. Что если пользователь выполнит одну и ту же операцию дважды с разными наборами DownloadRunnables (до завершения первого)

  2. Пользователь должен сначала установить Handler как отдельный объект enum (не такой удобный для пользователя или интуитивно понятный).

  3. Может быть, я мог бы создать Карту DownloadRunnables, каждый с идентификатором (статическое поле - автоинкремент), который будет возвращен обратно, и тогда можно будет выполнить правильный исполняемый файл ... но все это становится более сложным, чем я надеялся.

1 Ответ

1 голос
/ 30 мая 2010

Шаг # 1: написать интерфейс, описывающий API стратегии

Шаг # 2: написать реализации интерфейса для каждого шаблона стратегии

Шаг # 3: Activity должен либо передать экземпляр шаблона стратегии, либо какой-либо идентификатор шаблона для использования (таким образом, Service создает объект) при запросе загрузки

Это кажется слишком простым. Я думаю, что упускаю суть вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...