#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
. И теперь я жду.