2011-02-18 65 views
4

我最近收到了相同的ANR報告。 當應用程序試圖繪製一些位圖時(當使用ImageView作爲元素渲染GridView時),ANR發生。 我已經做了大量的調試,現在可以肯定地說,掛起既不依賴於位圖,也不依賴於它被繪製的位置。ANR在Canvas.native_drawBitmap

堆是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

這些位圖有多大?我們在這裏談論多少個ImageView?您可以發佈您嘗試使用的佈局嗎?或生成佈局的一些代碼?我的懷疑只是圖像太大(尺寸或密度),很難在較慢的手機上繪製這些圖像。如果他們都在同一個屏幕上,它很可能會擠壓和增長。 – 2011-02-19 06:37:54

回答

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線程。