我有一个从互联网上下载文件的服务。我想要的是响应(在这种情况下是一个InputStream)由可以切换的自定义处理程序处理(如策略模式),但我无法弄清楚如何执行此操作。
基本上,API的用户可以为响应插入不同的处理程序,有些人会解析XML,有些人可能会保存文件等。
我意识到我可以通过活动上下文并从中执行该方法(给定一些接口),但我不想明显这样做,以防在同时关闭Activity时文件仍在下载。
我该怎么做?
更新 - 我只是有一个想法,如果在下载的执行之间更改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);
这种作品虽然不那么优雅。
如果用户使用不同的DownloadRunnable设置两次运行相同的操作(在第一次完成之前),该怎么办
用户必须首先设置Handler是一个单独的枚举对象(不是那么用户友好或直观)。
也许我可以创建一个DownloadRunnables的Map,每个都有一个ID(静态字段 - 自动增量),它会被传回来,然后正确的runnable可以被执行......但是这一切都变得比我复杂了希望的。
答案 0 :(得分:1)
步骤1:编写描述策略API的接口
步骤2:为每个策略模式编写接口的实现
步骤3:让Activity
在请求下载时传递策略模式实例或要使用的模式的某个标识符(以便Service
创建对象)
这似乎太简单了。我想我错过了你的问题。