我有從互聯網上下載文件的服務。我想要的是響應(這種情況下的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);
這種作品不是很優雅。
如果用戶設置不同的DownloadRunnables運行相同的操作兩次(第一次完成之前)
用戶必須首先設置處理程序是一個獨立的枚舉對象(不那麼用戶友好或直覺)。
也許我可以創建一個DownloadRunnables的地圖,每個地圖都有一個ID(靜態字段 - 自動增量)傳回來,然後正確的可執行文件可以執行......但所有這些都變得比我希望的複雜。
但我不能將對象傳遞給服務,除非它們是可派生的 - 那麼如何通過策略 – jax 2010-05-30 18:30:07
「但我不能將對象傳遞給服務,除非它們是可派生的」當然可以。只有遠程服務纔會禁止這種情況,在這種情況下,無論如何,客戶完全無法提供策略。 – CommonsWare 2010-05-30 18:44:12
爲什麼在這種情況下是不可能的,因爲在你的答案中你說這很容易? – jax 2010-06-01 16:38:24