java.lang.Исключение IllegalStateException: в android.os.Parcel.Исключение чтения

#java #android #runtimeexception #soundpool #parcel

Вопрос:

Я вижу это исключение в своих жизненно важных функциях Android:

 java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3303)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3411)
  at android.app.ActivityThread.-wrap12 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1994)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7529)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)
Caused by: java.lang.IllegalStateException: 
  at android.os.Parcel.readException (Parcel.java:1962)
  at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:183)
  at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:135)
  at android.content.ContentProviderProxy.call (ContentProviderProxy.java:651)
  at android.provider.Settings$NameValueCache.getStringForUser (Settings.java:1996)
  at android.provider.Settings$Global.getStringForUser (Settings.java:10437)
  at android.provider.Settings$Global.getString (Settings.java:10426)
  at android.provider.Settings$Global.getInt (Settings.java:10608)
  at com.android.internal.policy.PhoneWindow.<init> (PhoneWindow.java:385)
  at com.android.internal.policy.HwPhoneWindow.<init> (HwPhoneWindow.java:91)
  at com.android.internal.policy.HwPolicyFactoryImpl.getHwPhoneWindow (HwPolicyFactoryImpl.java:49)
  at com.android.internal.policy.HwPolicyFactory.getHwPhoneWindow (HwPolicyFactory.java:50)
  at android.app.Activity.attach (Activity.java:7314)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3233)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3411)
  at android.app.ActivityThread.-wrap12 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1994)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7529)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)
 

Как можно выяснить, в чем причина, если она не ссылается ни на один из моих кодов?

Единственное большое изменение заключается в том, что я добавил файлы .m4a в папку необработанных ресурсов и использую их с SoundPool. Я предполагаю, что это связано с этим, и периодически происходит сбой при запуске приложения.

После поиска я нашел это, чтобы добавить в свой файл build.gradle:

 aaptOptions {
   noCompress "mp3"
}
 

Я добавил это, заменив mp3 m4a . Или так и должно быть aac ? Я лучше использую .возможно, файлы wav? Спасибо.

ИЗМЕНИТЬ: Следующее проливает больше света, т. е. файл ресурсов не найден. Тем не менее, в большинстве случаев, когда я запускаю приложение, оно оказывается в порядке.

 java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3303)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3411)
  at android.app.ActivityThread.-wrap12 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1994)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7529)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)
Caused by: android.content.res.Resources$NotFoundException: 
  at android.content.res.ResourcesImpl.openRawResourceFd (ResourcesImpl.java:380)
  at android.content.res.Resources.openRawResourceFd (Resources.java:1443)
  at android.media.SoundPool.load (SoundPool.java:235)
  at [appname].GlobalVariables.getSoundPool (GlobalVariables.java:553)
  at [appname].MainActivity.onCreate (MainActivity.java:85)
  at android.app.Activity.performCreate (Activity.java:7383)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1218)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3256)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3411)
  at android.app.ActivityThread.-wrap12 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1994)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7529)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)
Caused by: java.io.FileNotFoundException: 
  at android.content.res.AssetManager.openNonAssetFdNative (AssetManager.java)
  at android.content.res.AssetManager.openNonAssetFd (AssetManager.java:803)
  at android.content.res.ResourcesImpl.openRawResourceFd (ResourcesImpl.java:378)
  at android.content.res.Resources.openRawResourceFd (Resources.java:1443)
  at android.media.SoundPool.load (SoundPool.java:235)
  at [appname].GlobalVariables.getSoundPool (GlobalVariables.java:553)
  at [appname].MainActivity.onCreate (MainActivity.java:85)
  at android.app.Activity.performCreate (Activity.java:7383)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1218)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3256)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3411)
  at android.app.ActivityThread.-wrap12 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1994)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7529)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)
 

Ответ №1:

Это похоже на ошибку платформы, влияющую на первый запуск приложения после установки. ОС запускает приложение до того, как все содержимое apk было извлечено, и поэтому она обнаруживает недостающие ресурсы. Вероятно, это происходит периодически из-за различной нагрузки на внешнее хранилище (в зависимости от того, сколько процессов использует его в данный момент). Вы можете заметить такое же поведение с рисованными экранами — заставками, особенно если они большие (при первом запуске приложения вы будете видеть белый/черный экран в течение более длительного времени до появления изображения-заставки-во время распаковки файла устройством).

Самым быстрым решением было бы отложить загрузку ресурса до тех пор, пока он не будет готов (путем повторной проверки с обработкой исключений).

Если это не вариант, вы можете попробовать преобразовать свой ресурс в ресурс (java/…/res/raw -> /активы), который может вывести его в начало очереди распаковки и сделать его доступным для приложения раньше. Однако нет никаких гарантий, что это будет работать (все время).

Последним средством было бы хранить звуковые файлы (если они не слишком большие) в коде/классе в виде массивов байтов (но это некрасиво). Это гарантирует, что данные будут загружены одновременно с кодом задолго до его выполнения.

Комментарии:

1. Спасибо. Я поместил код в конец onCreate . И теперь я жду.