类MemoryFile有什么用?

时间:2013-11-04 22:09:22

标签: android shared-memory inter-process-communicat

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

为此,我阅读了我在MemoryFile上找到的所有信息以及如何在活动之间转移它,特别是这个stackoverflow条目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代码,但希望避免这种额外的复杂性。

1 个答案:

答案 0 :(得分:0)

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