Передача результатов дескриптора файла посылки в исключении 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? Заранее спасибо.

0 ответов

Другие вопросы по тегам