2013-06-28 209 views
0

我有一種方法返回一個BufferedReader,我的應用程序從中獲取另一個程序的輸出。將BufferedReader傳遞給服務

在Manager.java

public BufferedReader start() { 
    String[] commandLine2 = { "/system/bin/sh", "/system/app/launcher.sh" }; 

    Process process = null; 

    try { 
     process = Runtime.getRuntime().exec(commandLine2); 
     reader = new BufferedReader(new InputStreamReader(
       process.getInputStream())); 
     writer = new OutputStreamWriter(process.getOutputStream()); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return reader; 
} 

在我的MainActivity我使用: outputReader = manager.start();其中outputReader是BufferedReader和經理的私有實例是經理之一。

只要我在MainActivity.java裏面的東西一個的AsyncTask使用緩衝讀卡器進入ok了,因爲我BufferedReader是在其範圍內可見,當我想用​​一個服務來完成我有一些麻煩的任務。

沒有辦法將Intent.putExtra(Object)用於既不可序列化也不可Parcelable的對象(並且我的BufferedReader不是)。

如何將我的BufferedReader傳遞給服務?

+0

你就不能暴露你的服務的公共方法,並把它傳遞給?例如'setReader()'。看到這裏:http://stackoverflow.com/questions/2272378/android-using-method-from-a-service-in-an-activity –

+0

在我的MainActivity我使用此代碼來啓動服務:'Intent service = new意圖(getApplicationContext(),ReaderService.class); startService(service);'在這種情況下,我怎麼能使用'setReader()'方法?當然,有這樣的方法是有用的和足夠的 – Rob013

+1

如果不知道你的架構或服務,我會說一個綁定的服務會更好 - 那麼你基本上可以在你的活動中引用你的服務,你可以調用公共方法*。看看這裏的IBinder示例:http://stackoverflow.com/a/10799514/833647 –

回答

1

我會建議你使用Bound Service

http://developer.android.com/guide/components/bound-services.html

一個綁定的服務是在客戶機 - 服務器接口的服務器。一個綁定的服務允許組件(如活動)綁定到服務,發送請求,接收響應,甚至進行進程間通信(IPC)

基本上你可以暴露你的服務的公共方法和調用它們。因此,在這種情況下,您可以在您的服務中創建如下內容:

public void setReader(BufferedReader reader) { 
    this.reader = reader; 
    // do whatever you want with it in your service, etc. 
} 

並從您的活動中調用它。

欲瞭解更多詳情,請參閱本偉大的職位:Android - Using method from a Service in an Activity?

1

我只通過Intent.putExtra傳遞原始數據,只有它們是幾個。 當我需要更多的基元時,我聲明瞭一個DataTransferObjectOfMyType,它們保持在一起。 這就是我設置爲常見的地方,如MyApplication類中的ApplicationContext。 關於新的意圖,我檢查是否存在,並使用它。好或壞的設計我不在乎。這是工作。如果你對所有事情都很重要,比使用這種方法,因爲它正在工作:)

btw:我不會通過Buffered閱讀器,因爲誰知道什麼時候需要關閉。 而不是我會傳遞所有參數,這需要創建一個BufferedReader。

我希望它有幫助!

+0

感謝您的答案數學,我會嘗試你的方法(你怎麼能保存DTO在你的應用程序上下文?使用Bundle或SharedPreferences也許?)但Bound Services只是根據你的建議,根據你的建議,我學到了一些新東西,不管它是怎樣工作的:D – Rob013

+0

@ Rob013 DTO在Activity之間傳遞了一個setter和getter,就像屬性一樣。如果需要我做出persinstent,那麼需要編寫他的序列化和反序列化過程。這樣做的一個優點是:我知道那裏有什麼,我有完全訪問權限而不是Buffered Reader os其他複雜的系統對象,可能有一些不可序列化的字段。有幾次遇到這些情況,需要大量覆蓋和解決方法。這是簡單的工作解決方案:)易於測試,修改等。爲什麼要重新發明輪子? :) – 2013-06-28 14:42:28