2013-11-04 55 views
4

我計劃在單獨的進程中使用活動和服務之間的共享內存來傳輸它們之間的大內容。有什麼用途的MemoryFile類?

爲此,我閱讀了我在MemoryFile上找到的每個信息,以及如何在活動和特定於此計算器條目what is the use of MemoryFile in android之間轉移它。

但我無法在我的android版本4.xx上調用getParcelFileDescriptor(使用描述的解決方案)。似乎該方法不再存在。

不過我到了下面的代碼到ParcelFileDescriptor發送到我的服務 (把它當作僞代碼,但實際上它是ruboto代碼):

shm = MemoryFile.new("picture", 1000) 
f = shm.getFileDescriptor() 
p = ParcelFileDescriptor.dup(f) 

b = Bundle.new() 
b.putParcelable("shm", p) 
msg.setData(b) 
service.send(msg) 

要測試共享內存是正確的我已經寫了一個字符串, 並嘗試在服務端檢索它。

我有以下的(真正的Java)的代碼來做到這一點:

Parcelable p = msg.getData().getParcelable("shm"); 
ParcelFileDescriptor shm = (ParcelFileDescriptor) p; 
FileDescriptor f = shm.getFileDescriptor(); 

if(f.valid()) { 
    FileInputStream in = new FileInputStream(f); 
    String s = readString(in); // this fail! 
} 

每一件事情是確定的,f是有效的,但是我可以從接收到的fileDiscriptor閱讀,我得到不: 產生java.io.IOException :讀失敗:EINVAL(無效參數)

對於閱讀的代碼如下:

public String readString(InputStream inputStream) throws IOException { 
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream)); 
String s = r.readLine(); 
return s; 
} 

於是兩個問題:

  • 我做錯了嗎? (在任何一方)
  • 還是從#getParcelFileDescriptor放出的MemoryFile現在是 作爲一種意味着在兩個進程之間共享內存的不可用?

在後一種情況下,我看不出在這個類,那麼任何利益......

我所看到的其他文章提的JNI代碼使用的共享內存,但想避免額外的複雜性。

回答

0

我設法通過Android 4.0.4上的MemoryFile使用shm.getFileDescriptor()ParcelFileDescriptor.dup(f)來傳輸應用程序之間的數據,幸運的是,該類仍然可用。在你的情況下,問題可能在文件的內容中,但我不知道它是如何導致無效參數錯誤的。嘗試寫入和讀取固定長度的字節數組而不是字符串(您實際上沒有在提供的代碼中寫入),然後簡單地使用InputStream.read(buffer)來讀取它。

+0

儘管對於我來說它只能用於第一次讀/寫,之後遠程端無法讀取任何內容,並且在GC傳遞之後文件描述符變爲無效。好像你必須使用mmap和其他原生函數才能正常工作,所以我最終使用LocalSocket來完成我的任務而不是MemoryFile。 – lapis