Я планировал использовать общую память между активностью и службой в отдельном процессе для передачи большого контента между ними.
С этой целью я читаю всю информацию, которую я нашел в MemoryFile, и как ее передавать между действиями и, в частности, этой записью stackoverflow для чего нужен MemoryFile в android .
Но я не могу вызвать getParcelFileDescriptor (используя описанное решение) на моей версии Android 4.xx. Кажется, что этого метода больше не существует.
Тем не менее, я прихожу к следующему коду, чтобы отправить 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 действителен, но я не могу прочитать из полученного fileDisscriptor, я получаю: java.io.IOException: read failed: EINVAL (неверный аргумент)
Код для чтения следующий:
public String readString(InputStream inputStream) throws IOException {
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
String s = r.readLine();
return s;
}
Итак два вопроса:
- Я делаю неправильно? (в любую сторону)
- или MemoryFile, ампутированный из #getParcelFileDescriptor, теперь непригоден для использования в качестве средства для разделения памяти между двумя процессами?
В этом последнем случае я не вижу никакого интереса к этому классу...
Я видел другую статью, в которой упоминается код JNI для использования общей памяти, но хотел бы избежать этой дополнительной сложности.