2013-04-15 20 views
0

使用自定義佈局並且有時啓用和禁用繪圖緩存。錯誤畫布:在使用setDrawingCacheEnabled(false)時嘗試使用回收的位圖

唯一的小問題,就是我開發分鐘APIVersion 9,但低於14的任何產生以下錯誤:

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected] 
E/AndroidRuntime(6954): at android.graphics.Canvas.throwIfRecycled(Canvas.java:1026) 
E/AndroidRuntime(6954): at android.graphics.Canvas.drawBitmap(Canvas.java:1065) 
E/AndroidRuntime(6954): at android.view.View.draw(View.java:13620) 
E/AndroidRuntime(6954): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
E/AndroidRuntime(6954): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
E/AndroidRuntime(6954): at android.view.View.draw(View.java:13589) 
E/AndroidRuntime(6954): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
E/AndroidRuntime(6954): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
E/AndroidRuntime(6954): at android.view.View.draw(View.java:13710) 
E/AndroidRuntime(6954): at android.widget.FrameLayout.draw(FrameLayout.java:467) 
E/AndroidRuntime(6954): at android.view.View.draw(View.java:13591) 
E/AndroidRuntime(6954): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
E/AndroidRuntime(6954): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
E/AndroidRuntime(6954): at android.view.View.draw(View.java:13589) 
E/AndroidRuntime(6954): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
E/AndroidRuntime(6954): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
E/AndroidRuntime(6954): at android.view.View.draw(View.java:13710) 
E/AndroidRuntime(6954): at android.widget.FrameLayout.draw(FrameLayout.java:467) 
E/AndroidRuntime(6954): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2211) 
E/AndroidRuntime(6954): at android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2281) 
E/AndroidRuntime(6954): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2177) 
E/AndroidRuntime(6954): at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2045) 
E/AndroidRuntime(6954): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1854) 
E/AndroidRuntime(6954): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
E/AndroidRuntime(6954): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
E/AndroidRuntime(6954): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
E/AndroidRuntime(6954): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
E/AndroidRuntime(6954): at android.view.Choreographer.doFrame(Choreographer.java:532) 
E/AndroidRuntime(6954): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
E/AndroidRuntime(6954): at android.os.Handler.handleCallback(Handler.java:725) 
E/AndroidRuntime(6954): at android.os.Handler.dispatchMessage(Handler.java:92) 
我沒有直接使用任何位圖

,我真的不知道是什麼問題是。如果我將線條設置爲setDrawingCacheEnabled(false),事情就會起作用,但我希望保持它的性能。

+0

使用MAT分析器來查找內存泄漏。 www.youtube.com/watch?v=_CruQY55HOk。該傢伙展示瞭如何使用墊來尋找內存泄漏 – Raghunandan

+0

墊並沒有表明任何明顯的東西。這是一個非常小的應用程序,一個帶背景的自定義佈局和一個帶按鈕的主佈局。 – serenskye

回答

0

好的我解決了這個問題。我使用現有的代碼,但我認爲它沒有完全實現使用繪圖緩存。我認爲在現有的視圖上設置圖形緩存就是這樣,視圖會處理爲你使用緩存,但看起來你實際上需要實現它。

我將此添加到我的自定義佈局中,問題消失了;

@Override 
public void draw(Canvas canvas) { 
    if (cache != null && !cache.isRecycled()) { 
     canvas.drawBitmap(cache, x, y, null); 
    } else { 
     super.draw(canvas); 
    } 
}