フラグメント内にリストビューがあります。リストビューの各行にはimageviewがあり、ビットマップイメージをロードしています。ビットマップをイメージビューのタグとして設定しました。次回、ヌル以外のタグを含むイメージビューが発生すると、タグ内のビットマップをリサイクルしてイメージをイメージにリロードしています。これは、アクティビティの向きが変更されたときに「キャンバス:リサイクルビットマップを使用しようとしましたandroid.graphics.Bitmap」クラッシュを引き起こしています。なぜこれが起こっているのか分かりませんでした。助けてください。キャンバス:フラグメントの構成変更時にリサイクルビットマップクラッシュを使用しようとしています
Bitmap bitmap = (Bitmap) imageView.getTag();
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
}
Ion.with(appContext)
.load(uri)
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap result) {
if (result != null) {
imageView.setImageBitmap(result);
imageView.setTag(result);
}
}
});
スタックトレース: java.lang.RuntimeException:キャンバス:(Canvas.java:1270)android.graphics.Canvas.throwIfCannotDrawでリサイクルビットマップ[email protected] を使用しようとして でandroid.graphics.Canvas.drawBitmap(Canvas.java:1404)android.graphics.drawable.BitmapDrawable.draw(0120) android.view.View.View.draw(View.java:16184) at android.view.View.updateDisplay ListIfDirty(View.java:15180) android.view.View.draw(View.java:15954) android.view.ViewGroup.drawChild(ViewGroup.java:3609) android.view.ViewGroup.dispatchDraw( ViewGroup.java:3399) android.view.View.updateDisplayListIfDirty(View.java:15175) (android.view.View.draw(View.java:15954)) (android.view.ViewGroup.drawChild(ViewGroup。 java:3609) android.widget.ListView.drawChild(ListView.java:3418) android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) android.widget.AbsListView.dispatchDraw(AbsListView .java:2615) android.widget.ListView.dispatchDraw(ListView.java:3413) android.view.View.draw(View.java:16187) android.widget.AbsListView.draw(AbsListView.java :4166) android.view.View.updateDisplayListIfDirty(View.java:15180) android.view.View.draw(View.java:15954) android.view.ViewGroup.drawChild(ViewGroup.java:3609) ) android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) (android.view.View.updateDisplayListIfDirty(View.java:15175)) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.jav (ViewGroup.java:3573) android.view.View.View.ViewReplaceChildDisplayList(ViewGroup.java:3573)の にあるandroid.view.updateDisplayListIfDirty(View.java:15140) の は、 (ViewGroup.java:3593) android.view.View.View.ViewReplaceChildDisplayList android.view.View.View.View.View.ViewDateViewListFile(ViewGroup.java:3573)の (android.view.View.updateDisplayListIfDirty(View.java:15140)) でandroid.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) でandroid.view.View.View.View.GetDisplayList(ViewGroup.java:3573) にandroid.view.View.updateDisplayListIfDirty(ビュー。(ViewGroup.java:3593) とandroid.view.View.updateDisplayListIfDirty(View.java: 15140) android.view.View.ViewDateDisplayListIfDirty(View.java:15140)で を表示します。 android.view.View.View.ViewReplaceChildDisplayList(ViewGroup.java:3593)の android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)android.view.ViewGroup.dispatchGetDisplayListでandroid.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) でandroid.view.View.updateDisplayListIfDirty(View.java:15140) (ViewGroup.java:3573) ででandroid.view.View.updateDisplayListIfDirty(View.java:15140)android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)で android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)で アンドロイドで 。 view.ThreadedRenderer.draw(ThreadedRenderer.java:322) android.view.ViewRootImpl.draw(ViewRootImpl.java:2615)android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) でandroid.view.ViewRootImpl.performTraversalsでandroid.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434) (ViewRootImpl.java:2067) で10でandroid.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:6013) android.view.Choreographer $ CallbackRecord.run(Choreographer.java:858) android.view.Choreographer.doCallbacks(Choreographer.java:670) android.view.Choreographer.doFrame(Choreographer.java:606) android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:844) android.os.Handler。
あなたの質問を明確にすることはできますか? Ionは内部メモリまたはサーバーからイメージを取得し、イメージビューに設定するためにURIを取得します。クラッシュがビットマップリサイクルに関係しているかどうかはわかりません。フルログトレースをここに貼り付けてください。 –
ビットマップを読み込んでいて、OutOfMemoryがクラッシュしていました。だから、新しい画像を画像ビューにロードする必要があるときはいつでも、ビットマップ(すでに画像ビューに割り当てられていた)によって使用されるメモリを解放したかったのです。しかし、これは、アクティビティの方向がポートレートからランドスケープに変わったときにクラッシュを引き起こしています。質問にスタックトレースを追加しました –