У меня есть служба, которая загружает файл из Интернета. Я хочу, чтобы ответ (в данном случае 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);
Это работает, но не так элегантно.
Что если пользователь выполнит одну и ту же операцию дважды с разными наборами DownloadRunnables (до завершения первого)
Пользователь должен сначала установить Handler как отдельный объект enum (не такой удобный для пользователя или интуитивно понятный).
Может быть, я мог бы создать Карту DownloadRunnables, каждый с идентификатором (статическое поле - автоинкремент), который будет возвращен обратно, и тогда можно будет выполнить правильный исполняемый файл ... но все это становится более сложным, чем я надеялся.