2010-05-30 43 views
1

我有從互聯網上下載文件的服務。我想要的是響應(這種情況下的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); 

這種作品不是很優雅。

  1. 如果用戶設置不同的DownloadRunnables運行相同的操作兩次(第一次完成之前)

  2. 用戶必須首先設置處理程序是一個獨立的枚舉對象(不那麼用戶友好或直覺)。

  3. 也許我可以創建一個DownloadRunnables的地圖,每個地圖都有一個ID(靜態字段 - 自動增量)傳回來,然後正確的可執行文件可以執行......但所有這些都變得比我希望的複雜。

回答

1

步驟#1:寫的接口描述戰略API

步驟#2:寫接口的實現爲每個策略模式

步驟#3:讓Activity要麼通過在一個策略模式實例或要使用的模式的一些標識符(所以Service創建對象)當它請求下載

這似乎太簡單了。我想我錯過了你的問題的重點。

+0

但我不能將對象傳遞給服務,除非它們是可派生的 - 那麼如何通過策略 – jax 2010-05-30 18:30:07

+0

「但我不能將對象傳遞給服務,除非它們是可派生的」當然可以。只有遠程服務纔會禁止這種情況,在這種情況下,無論如何,客戶完全無法提供策略。 – CommonsWare 2010-05-30 18:44:12

+0

爲什麼在這種情況下是不可能的,因爲在你的答案中你說這很容易? – jax 2010-06-01 16:38:24

相關問題