亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果我在 onDestroy() 內調用 recycle() ,“無法繪制回收的位圖”

如果我在 onDestroy() 內調用 recycle() ,“無法繪制回收的位圖”

湖上湖 2023-07-13 15:34:45
我有兩項活動:MainActivity和Activity2。MainActivity只是通過Intent打開第二個。要返回MainActivity,Activity2我按“后退”按鈕。當我執行這些步驟時,應用程序崩潰:打開應用程序:MainActivity出現啟動Intent:Activity2出現按“返回”按鈕:MainActivity出現啟動Intent:我的應用程序由于此錯誤而崩潰:IllegalArgumentException:無法繪制回收的位圖MainActivity.java:Intent intent = new Intent(this, Activity2.class); startActivity(intent);Activity2.java:@Overridepublic void onBackPressed() {    super.onBackPressed();}@Overrideprotected void onDestroy() {    super.onDestroy();    for(Map.Entry<Integer, ImageView> entry : mapImageViews.entrySet()) {        ImageView imageView = entry.getValue();        Drawable drawable = imageView.getDrawable();        if (drawable instanceof BitmapDrawable) {            BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;            Bitmap bitmap = bitmapDrawable.getBitmap();            if(bitmap != null) {                bitmap.recycle();            }            bitmapDrawable = null;            bitmap = null;        }        imageView.setOnClickListener(null);        imageView.setImageDrawable(null);        imageView.setImageBitmap(null);        imageView = null;        drawable = null;    }    mapImageViews.clear();    mapImageViews = null;}由于應用程序使用高分辨率圖像(已使用BitmapFactory和進行調整inSampleSize),為了避免內存泄漏,我recycle()在該onDestroy()方法中調用。正如我通過閱讀大量 SO 答案和在網絡上了解到的那樣,調用recycle()位圖可以讓它們盡早被垃圾收集。但許多其他帖子建議不要調用recycle(),或者至少建議僅當您確定 Activity 中不再需要位圖(即方法中)時才執行此操作onDestroy()?,F在我有點擔心我所學到的東西,因為如果我刪除該recycle()錯誤就不會再發生。該錯誤發生在 Android 設備上,但在 Android和(Android )4.4.2設備上不會發生。6.0Nexus 75.1.1問題出在活動堆棧上嗎?GC 嘗試釋放位圖內存是否太晚了?在這種情況下,如何徹底銷毀 Activity 及其所有內容?這兩個Android版本有什么區別嗎?或者我遺漏/錯誤的東西?
查看完整描述

3 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

嘗試改變你的onDestroy方法如下


@Override

protected void onDestroy() {

? ? for(Map.Entry<Integer, ImageView> entry : mapImageViews.entrySet()) {

? ? ? ? ImageView imageView = entry.getValue();

? ? ? ? Drawable drawable = imageView.getDrawable();

? ? ? ? if (drawable instanceof BitmapDrawable) {

? ? ? ? ? ? BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;

? ? ? ? ? ? Bitmap bitmap = bitmapDrawable.getBitmap();

? ? ? ? ? ? if(bitmap != null) {

? ? ? ? ? ? ? ? bitmap.recycle();

? ? ? ? ? ? }

? ? ? ? ? ? bitmapDrawable = null;

? ? ? ? ? ? bitmap = null;

? ? ? ? }

? ? ? ? imageView.setOnClickListener(null);

? ? ? ? imageView.setImageDrawable(null);

? ? ? ? imageView.setImageBitmap(null);

? ? ? ? imageView = null;

? ? ? ? drawable = null;

? ? }

? ? mapImageViews.clear();

? ? mapImageViews = null;


? ? super.onDestroy();

}

查看完整回答
反對 回復 2023-07-13
?
森欄

TA貢獻1810條經驗 獲得超5個贊

根據回收文件

位圖被標記為“死”,這意味著如果調用 getPixels() 或 setPixels() 它將拋出異常,并且不會繪制任何內容。此操作無法逆轉,因此僅當您確定該位圖不再使用時才應調用它。

我看不到你如何將 your 分配bitmaps給 your?ImageView,但我假設當你在位圖被使用后再次啟動意圖時,你正在嘗試重用位圖recycled。我只在使用時遇到異常android:src=。如果我ImageView使用以下內容設置位圖oncreate,它在您列出的所有目標上運行良好,不會引發異常。

imageView.setImageBitmap(BitmapFactory.decodeResource(getResources(),?R.drawable.lake_park));
查看完整回答
反對 回復 2023-07-13
?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

實際上我認為你不必手動執行此操作。

如果 Activity2 只有 1 個圖像并且已經調整大小,我認為如果您確實面臨內存問題,回收不會有太大幫助。

并且根據該文檔,僅建議API級別低于10的用戶使用recycle(),并且用戶的比例很小。?On Android 2.3.3 (API level 10) and lower, using recycle() is recommended.?

我想推薦使用第三方圖像庫,因為它們可以讓您免于做這些無意義的事情,讓您專注于應用程序更重要的部分。


查看完整回答
反對 回復 2023-07-13
  • 3 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號