Canvas.native_drawBitmap 中的 ANR

Eug*_*kov 5 android native bitmap

我最近也收到了同样的 ANR 报告。当应用程序尝试绘制一些位图时(使用 ImageView 作为元素渲染 GridView 时),会发生 ANR。我已经做了很多调试,现在可以肯定地说挂起既不依赖于位图,也不依赖于它的绘制位置。

堆是 50% 自由的,图像不大于 400px^2
网格元素没有任何自定义布局 - 只是简单的 ImageView。
在 HTC Desire(1 GHz CPU)、Hero、模拟器等上进行了测试
。ANR 会永远持续下去,因此就像在绘制位图时正在运行某些无限循环。

还有什么会导致这样的挂起?

报告如下:

DALVIK THREADS:
"main" prio=5 tid=1 NATIVE
  | group="main" sCount=1 dsCount=0 s=N obj=0x40020ba0 self=0xddd0
  | sysTid=32366 nice=0 sched=0/0 cgrp=unknown handle=-1345025972
  at android.graphics.Canvas.native_drawBitmap(Native Method)
  at android.graphics.Canvas.drawBitmap(Canvas.java:1045)
  at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:323)
  at android.widget.ImageView.onDraw(ImageView.java:860)
  at android.view.View.draw(View.java:6740)
  at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
  at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
  at android.view.View.draw(View.java:6743)
  at android.widget.FrameLayout.draw(FrameLayout.java:352)
  at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
  at android.view.View.draw(View.java:6743)
  at android.widget.FrameLayout.draw(FrameLayout.java:352)
  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1847)
  at android.view.ViewRoot.draw(ViewRoot.java:1407)
  at android.view.ViewRoot.performTraversals(ViewRoot.java:1163)
  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:123)
  at android.app.ActivityThread.main(ActivityThread.java:4627)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:521)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
  at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

the*_*osh 1

如果没有代码或至少没有一个小样本,就很难查明您的问题。您可能需要使用AsyncTask加载图像。另外开启StrictMode对于发现ANR错误非常有帮助。

public void onCreate() {
 if (DEVELOPER_MODE) {
     StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
             .detectDiskReads()
             .detectDiskWrites()
             .detectNetwork()   // or .detectAll() for all detectable problems
             .penaltyLog()
             .build());
     StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
             .detectLeakedSqlLiteObjects()
             .detectLeakedClosableObjects()
             .penaltyLog()
             .penaltyDeath()
             .build());
 }
 super.onCreate();
 }
Run Code Online (Sandbox Code Playgroud)

确保在发布之前删除 StrictMode。它会在 api 级别 9 之前的设备上导致验证错误。这是在开发过程中使用的一个很好的功能。当您执行可能阻塞 UI 线程的操作时,它会导致您的应用程序正常崩溃。