Anr访问AssetManager时

时间:2017-06-24 17:53:34

标签: android

执行以下代码段时,我得到了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。但案件数量很少。无法找到任何相关内容。

1 个答案:

答案 0 :(得分:0)

遵守以下原则将有助于您避免不必要的崩溃和ANR

1)确保请求的资源在相应的文件夹(资产/原始)中可用。

2)使用应用程序上下文mContext.getApplicationContext()访问资源。资源本应是应用程序级别的,因此上下文也必须是同一级别的。

3)在使用iostream的任何地方添加try{} catch{}。由于AssetManager取决于流。在catch块中打印stacktrace。

4)最后,请确保您生成的apk支持所有类型的ABI (Android Binary Interfaces)