Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 错误画布:使用setDrawingCacheEnabled时尝试使用回收的位图(false)_Android_Android Widget - Fatal编程技术网

Android 错误画布:使用setDrawingCacheEnabled时尝试使用回收的位图(false)

Android 错误画布:使用setDrawingCacheEnabled时尝试使用回收的位图(false),android,android-widget,Android,Android Widget,我使用自定义布局,有时启用和禁用图形缓存 唯一的问题是我正在为min APIVersion 9开发,但是低于14的任何内容都会产生以下错误: java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@41ee8a88 E/AndroidRuntime( 6954): at android.graphics.Canvas.throwIfRecycled(Canvas.

我使用自定义布局,有时启用和禁用图形缓存

唯一的问题是我正在为min APIVersion 9开发,但是低于14的任何内容都会产生以下错误:

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@41ee8a88
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)
,一切都会正常,但我希望保留它以提高性能

好的,我解决了这个问题。我使用的是现有代码,但我认为它还没有完全实现以使用图形缓存。我认为在现有视图上设置图形缓存就是这样,视图将为您处理使用缓存的问题,但看起来您实际上需要实现它

我把这个添加到我的自定义布局中,问题就消失了

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

使用MAT分析仪查找内存泄漏。www.youtube.com/watch?v=_CruQY55HOk。这家伙展示了如何使用mat查找内存泄漏。但这并不表示有任何明显的问题。这是一个非常小的应用程序,一个带有背景的自定义布局和一个带有按钮的主布局。