0

カスタム レイアウトを使用していて、描画キャッシュを有効または無効にすることがあります。

唯一の落とし穴は、最小 API バージョン 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)を外すとうまくいきますが、パフォーマンスのためにそのままにしておきたいです。

4

1 に答える 1

0

さて、私は問題を修正しました。既存のコードを使用していましたが、描画キャッシュを使用するために完全に実装されていたとは思いません。既存のビューに描画キャッシュを設定するだけで、ビューがキャッシュを使用して処理してくれると思っていましたが、実際には実装する必要があるようです。

これをカスタム レイアウトに追加したところ、問題はなくなりました。

@Override
public void draw(Canvas canvas) {
    if (cache != null && !cache.isRecycled()) {
        canvas.drawBitmap(cache, x, y, null);
    } else {
        super.draw(canvas);
    }
}
于 2013-04-16T14:14:52.590 に答える