zengtianyu12 2017-07-24 09:48 采纳率: 20%
浏览 1978
已采纳

Imageview进行了recycle()之后再次打开加载同一图片遇到闪退

如题,由于优化内存,进行了bitmap.recycle,但是再次打开加载同一个activity的时候闪退。activity在finish的时候已经recycle,而且没有其他地方引用,居然会闪退。希望有更好的方法。求助,谢谢。代码如下:(setName之类的已经在merge中建立和声明)

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;

public class DetailYS extends merge {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.merge);
    setName("  ys", Color.rgb(255,255,255));
    setBirthday("");
    setPhone("");
    setEmail("");
    setUni("");
    setPhoto(R.drawable.yangshun);
    findViewById(R.id.floatingActionButtonCall).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            DetailYS.this.onDestroy();
            Intent intent = new Intent(DetailYS.this,MainActivity.class);
            startActivity(intent);
        }
    });
}

@Override
protected void onDestroy(){
    super.onDestroy();
    ImageView imageView = findViewById(R.id.app_bar_image);
    if(imageView!=null){
        Drawable drawable = imageView.getDrawable();
        if(drawable!=null){
            if (drawable instanceof BitmapDrawable){
                BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable;
                Bitmap bitmap = bitmapDrawable.getBitmap();
                if(bitmap!=null && !bitmap.isRecycled()){
                    bitmap.recycle();
                }
            }
        }
    }
    DetailYS.this.finish();

}
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode== KeyEvent.KEYCODE_BACK){
        DetailYS.this.finish();
        Intent intent = new Intent(DetailYS.this,MainActivity.class);
        startActivity(intent);
    }
    return true;
}

}


  • 写回答

4条回答 默认 最新

  • 艾阳Blog 博客专家认证 2017-07-24 10:01
    关注

    原因是:ImageView有两个方法来设置一张显示的图片:android:background="@drawable/aa" android:src="@drawable/aa" ,这个应该能看明白。
    imageView.setImageBitmap()方法设置的是对应的src的图片,而不是background。而如果把background的图片给回收了,就导致了异常的发生。
    所以修改成,去调用setBackGround()设置图片背景的方法。总之,一定要注意ImageView图片的来源问题,然后在进行相应的recycle。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵