我最近收到了相同的ANR报告。 当app尝试绘制一些位图时(当使用ImageViews渲染GridView作为元素时)会发生ANR。 我已经做了很多调试,现在肯定可以说挂起既不依赖于位图,也不依赖于绘制它的位置。
堆是50%免费的,图像不大于400px ^ 2
网格元素没有任何自定义布局 - 只需简单的ImageView
测试HTC Desire(1 GHz CPU),英雄,模拟器等
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)
答案 0 :(得分: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();
}
确保在发布之前删除StrictMode。它将在api级别9之前在设备上引起VerifyError。 在开发过程中使用它是一个很好的功能。当您执行可能阻止UI线程的操作时,它将导致您的应用程序正常崩溃。