Java.lang.RuntimeException: Не удалось прочитать дескрипторы файла входного канала из посылки

Я использую crashlytics, чтобы отслеживать крушение моего приложения. Есть одна ошибка, которую довольно сложно понять. Трассировка стека из crashlytics выглядит следующим образом:

java.lang.RuntimeException: Could not read input channel file descriptors from parcel. at android.view.InputChannel.nativeReadFromParcel(InputChannel.java) at android.view.InputChannel.readFromParcel(InputChannel.java:148) at android.view.InputChannel$1.createFromParcel(InputChannel.java:39) at android.view.InputChannel$1.createFromParcel(InputChannel.java:36) at com.android.internal.view.InputBindResult.<init>(InputBindResult.java:62) at com.android.internal.view.InputBindResult$1.createFromParcel(InputBindResult.java:102) at com.android.internal.view.InputBindResult$1.createFromParcel(InputBindResult.java:99) at com.android.internal.view.IInputMethodManager$Stub$Proxy.windowGainedFocus(IInputMethodManager.java:851) at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:1292) at android.view.inputmethod.InputMethodManager.onWindowFocus(InputMethodManager.java:1518) at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3550) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:157) at android.app.ActivityThread.main(ActivityThread.java:5293) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) at dalvik.system.NativeStart.main(NativeStart.java) 

Я знаю, что здесь есть один подобный вопрос. Но есть немного другое. И, как статистика от крашлитики, авария происходит главным образом в телефоне SAMSUNG android.

Я новичок в андроиде и не знаю, почему произошел сбой и как устранить этот крах.

Любое предложение будет высоко оценено.

Solutions Collecting From Web of "Java.lang.RuntimeException: Не удалось прочитать дескрипторы файла входного канала из посылки"

Подумайте, что это очень широкая область, и может быть много ситуаций, которые могут вызвать это исключение на системном уровне. Но, возможно, этот пример того, как он был зафиксирован в конкретном проекте, может помочь кому-то.

Я испытал подобное исключение:
"Could not read input channel file descriptors from parcel" на телефоне Samsung:

 java.lang.RuntimeException: Could not read input channel file descriptors from parcel. at android.view.InputChannel.nativeReadFromParcel(Native Method) at android.view.InputChannel.readFromParcel(InputChannel.java:148) at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:690) at android.view.ViewRootImpl.setView(ViewRootImpl.java:525) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:269) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) at android.widget.Toast$TN.handleShow(Toast.java:402) at android.widget.Toast$TN$1.run(Toast.java:310) at android.os.Handler.handleCallback(Handler.java:730) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) 

Это произошло в большом старом проекте, который я получил для обслуживания, и эта плавающая ошибка произошла только через несколько часов. Я потратил довольно много времени на это, а также прочитал некоторые связанные ответы на SO по поводу этого и не имел понятия, кроме того, что это ошибка на уровне системы Android, и в памяти должны быть дополнительные данные или дубликаты объектов или больших объектов и т. Д.

https://code.google.com/p/android/issues/detail?id=32470

Последнее, о чем я мог подумать, это SoundPool. В проекте много не используется – время от времени воспроизводится не более 10 различных звуков.
Но это была первопричина! Иногда из SoundPool "unable to load sample (null)" были плавающие исключения. И это помогло понять, что SoundPool использовался неправильно:

 public void play(int rscId) { ... final int soundId = soundPool.load(mContext, rscId, 1); ... soundPool.play(soundId, volume, volume, 5, 0, 1f); 

Таким образом, был создан новый идентификатор, и звуковой ресурс перезагружался каждый раз, когда приложение вызывало метод воспроизведения звука! И через некоторое время некоторые независящие исключения начали происходить до тех пор, пока приложение "Could not read input channel file descriptors from parcel" с "Could not read input channel file descriptors from parcel" .
Интересно, что одно из этих не связанных исключений было:
"ExceptionHandled in unable to open database file (code 14)" :

 ExceptionHandled in unable to open database file (code 14) android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14) at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow (Native Method) at android.database.sqlite.SQLiteConnection.executeForCursorWindow (SQLiteConnection.java:845) 

И, конечно, ему нечего делать ни с базой данных, ни с тостами / посылками. Исправить эту конкретную ситуацию было очень просто: просто предварительно загрузите все звуки, как это предлагается в документации Android:

http://developer.android.com/reference/android/media/SoundPool.html

«Логика загрузки повторяет список звуков, вызывающих соответствующую SoundPool.load() function . Обычно это делается на раннем этапе процесса, чтобы предоставить время для распаковки аудио в необработанный формат PCM, прежде чем они понадобятся для воспроизведения.
Как только звук загрузится и начнется воспроизведение, приложение может запускать звуки, вызывая SoundPool.play() . "

Поэтому я перевел soundPool.load() out from play() method и исключение:
"Could not read input channel file descriptors from parcel" , а также исключение "unable to open database file (code 14)" .

 public void play(int soundId) { ... soundPool.play(soundId, volume, volume, 5, 0, 1f); 

И soundPool.release(); soundPool = null soundPool.release(); soundPool = null следует вызывать, когда он больше не нужен. И, возможно, это также может повлиять на такие исключения, см. Подробности здесь

Не удалось прочитать дескрипторы файла входного канала из посылки

Скорее всего, это не точная ситуация для исходного вопроса, но надеюсь, что он может дать некоторую информацию, чтобы копать дальше. Т.е. ищет некоторые дополнительные исключения, проглотил исключения или неправильные файлы / обработку данных.

Я ищу ответ в течение долгого времени, например, другие, сталкивающиеся с этим исключением.

Как я вижу, этот сбой также может быть вызван неисключительным TextView или EditText который работает с InputMethodManager :

 java.lang.RuntimeException: Could not read input channel file descriptors from parcel. at android.view.InputChannel.nativeReadFromParcel(Native Method) at android.view.InputChannel.readFromParcel(InputChannel.java:148) at android.view.InputChannel$1.createFromParcel(InputChannel.java:39) at android.view.InputChannel$1.createFromParcel(InputChannel.java:36) at com.android.internal.view.InputBindResult.<init>(InputBindResult.java:68) at com.android.internal.view.InputBindResult$1.createFromParcel(InputBindResult.java:112) at com.android.internal.view.InputBindResult$1.createFromParcel(InputBindResult.java:109) at com.android.internal.view.IInputMethodManager$Stub$Proxy.startInput(IInputMethodManager.java:697) at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:1407) at android.view.inputmethod.InputMethodManager.checkFocus(InputMethodManager.java:1518) at android.view.inputmethod.InputMethodManager.restartInput(InputMethodManager.java:1286) at android.widget.TextView.setText(TextView.java:4718) at android.widget.TextView.setText(TextView.java:4656) at android.widget.TextView.append(TextView.java:4330) at android.widget.TextView.append(TextView.java:4320) ... 

Когда TextView добавляет текст, он сделает текст Editable и запустит InputMethodManager . Но в это время что-то пошло не так в процессе InputMethod , и это приводит к сбою в создании InputBindResult который считывает ошибку из посылки.

В этом случае обходной путь очень прост: не вызывайте append on textview напрямую, используйте SpannableStringBuilder или SpannableStringBuilder для создания текста и вместо этого вызывайте TextView.setText(text) !

Предыдущие пользователи отметили, что это может быть сложной ошибкой для отслеживания. Я вызвал это, создав диалоговое окно настраиваемого предупреждения (содержащее несколько объектов TextView ) внутри цикла while. Приложение разбилось перед отображением диалогового окна (ов).

Я получил эту ошибку из-за запуска слишком большого количества запросов при запуске Activity (для каждой строки в представлении списка). Потому что я пытался повторно открыть ту же самую активность, пока выполнялись запросы.

Исправлено: я запросил только один запрос для списка.