执行以下代码段时,我得到了ANR
String[] fontTypeArr = mContext.getAssets().list(path);
我正在从后台线程尝试这个,它有时会抛出这个
main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 obj=0x755a3000 self=0xb8c5c048
| sysTid=10050 nice=0 cgrp=default sched=0/0 handle=0xb6f8ebec
| state=S schedstat=( 1094690359 1522806824 1233 ) utm=84 stm=25 core=3 HZ=100
| stack=0xbe0ad000-0xbe0af000 stackSize=8MB
| held mutexes=
native: pc 000000000000f9e8 /system/lib/libc.so (syscall+28)
native: pc 0000000000013bd7 /system/lib/libc.so (__futex_wait_ex+42)
native: pc 0000000000013f6d /system/lib/libc.so (pthread_mutex_lock+310)
native: pc 000000000000d9bb /system/lib/libandroidfw.so (???)
native: pc 000000000000ee23 /system/lib/libandroidfw.so (_ZN7android12AssetManager10isUpToDateEv+12)
native: pc 000000000001b247 /data/dalvik-cache/arm/system@framework@boot.oat (Java_android_content_res_AssetManager_isUpToDate__+82)
at android.content.res.AssetManager.isUpToDate (AssetManager.java)
at android.app.ActivityThread.getPackageInfo (ActivityThread.java:1776)
- locked <@addr=0x12cdc260> (a android.app.ResourcesManager)
at android.app.ActivityThread.getPackageInfoNoCheck (ActivityThread.java:1750)
at android.app.ActivityThread.handleReceiver (ActivityThread.java:2595)
at android.app.ActivityThread.access$1700 (ActivityThread.java:154)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1394)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:135)
at android.app.ActivityThread.main (ActivityThread.java:5290)
at java.lang.reflect.Method.invoke! (Native method)
at java.lang.reflect.Method.invoke (Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:911)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:706)
从AssetManager api访问路径列表时获取anr。但案件数量很少。无法找到任何相关内容。
答案 0 :(得分:0)
遵守以下原则将有助于您避免不必要的崩溃和ANR
1)确保请求的资源在相应的文件夹(资产/原始)中可用。
2)使用应用程序上下文mContext.getApplicationContext()
访问资源。资源本应是应用程序级别的,因此上下文也必须是同一级别的。
3)在使用iostream的任何地方添加try{} catch{}
。由于AssetManager
取决于流。在catch块中打印stacktrace。
4)最后,请确保您生成的apk支持所有类型的ABI (Android Binary Interfaces)