4

我计划在单独的进程中使用活动和服务之间的共享内存来在它们之间传输大内容。

为此,我阅读了我在 MemoryFile 上找到的所有信息,以及如何在活动之间传输它,特别是这个 stackoverflow 条目什么是 MemoryFile 在 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: read failed: EINVAL (Invalid argument)

读取代码如下:

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

所以两个问题:

  • 我做错了吗?(在任何一侧)
  • 还是从#getParcelFileDescriptor 截断的MemoryFile 现在不能用作在两个进程之间共享内存的手段?

在后一种情况下,我看不到对这门课的任何兴趣......

我看过其他文章提到使用共享内存的 JNI 代码,但希望避免这种额外的复杂性。

4

1 回答 1

0

我设法通过MemoryFileAndroid 4.0.4 上的应用程序在应用程序之间传输数据shm.getFileDescriptor()ParcelFileDescriptor.dup(f)所以幸运的是,这个类仍然可用。在您的情况下,问题可能出在文件的内容中,尽管我不知道它如何导致 Invalid argument 错误。尝试写入和读取固定长度的字节数组而不是字符串(您实际上并未在提供的代码中写入)并使用InputStream.read(buffer).

于 2013-12-22T21:59:09.940 回答