Передача результатов дескриптора файла посылки в исключении DeadObjectException
Я пытаюсь перенести пользовательский сервис с Android O на Android P. Порт работает нормально, за исключением одного обратного вызова, который приводит к возникновению исключения android.os.DeadObjectException:
DeadObjectException: транзакция не удалась для небольшого участка; удаленный процесс вероятно умер
У моей службы есть метод, который делает это:
public void doFooBar(IFooBarCallback callback) {
//Do stuff
File fooFile = getFile(); //Not important how the file gets assigned
ParcelFileDescriptor foo = ParcelFileDescriptor.open(fooFile, ParcelFileDescriptor.MODE_READ_ONLY);
String bar = getBarString();
callback.onFooBarFinished(foo, bar);
}
onFooBarFinished - это метод обратного вызова, который передается в doFooBar вызывающей функцией. Достаточно сказать, что он находится в другом java-файле и выглядит примерно так:
IFooBarCallback mFooBarCallback = new IFooBarCallback.Stub() {
@Override
public void onFooBarFinished(ParcelFileDescriptor foo, String bar) {
//Do stuff
}
};
Итак, цель - выполнить doFooBar, сгенерировать PFD и String, а затем передать их в обратный вызов onFooBarFinished. Проблема в том, что я продолжаю получать android.os.DeadObjectException, когда код попадает в callback.onFooBarFinished(). Более того, это происходит, только если 1) аргумент foo имеет тип ParcelFileDescriptor и 2) foo!= Null. Если я жестко закодирую его до нуля, все в порядке. Как только foo указывает на файл, не имеет значения, на что указывает foo, я все равно получаю DeadObjectException. Я указал на пустой файл, небольшой файл с несколькими байтами данных и большой файл. И эта проблема специфична для ParcelFileDescriptor. Если я заменю foo, скажем, на строку, он также будет работать нормально.
Это также работает, если я перемещаю логику onFooBarFinished до doFooBar. Так нравится:
public void doFooBar(IFooBarCallback callback) {
//Do stuff
File fooFile = getFile(); //Not important how the file gets assigned
ParcelFileDescriptor foo = ParcelFileDescriptor.open(fooFile, ParcelFileDescriptor.MODE_READ_ONLY);
String bar = getBarString();
//callback.onFooBarFinished(foo, bar);
/* Execute onFooBarFinished logic locally */
}
Так что это тоже не ParcelFileDescriptor как таковой, но что-то о передаче аргумента в другой контекст вызывает исключение DeadObjectException. Ни служба doFooBar, ни процессы onFooBarFinished не умирают. После исключения DeadObjectException две службы могут продолжать общаться друг с другом.
Я никогда не видел этого с Android O. Кто-нибудь знает, что может вызвать DeadObjectException? Заранее спасибо.