处理位图时出现内存泄漏问题

时间:2017-10-18 18:26:43

标签: android memory

当我不再需要它时,我试图释放记忆,但这似乎并不容易。我创建一个包含一些图像(Bitmaps)的ListView。每次我这样做,内存监视器显示我的应用程序使用的内存增加。我就是这样做的:

private ArrayList<ImgMdl> populateList(){

    ArrayList<ImgMdl> list = new ArrayList<>();

    File folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + settingsFileDir + "/" + imgLogFileDir);

    if(folder.exists()) {
        File[] listOfFiles = folder.listFiles();
        listOfFiles = sortFileList(listOfFiles);

        for (int i = 0; i < listOfFiles.length; i++) {
            String imgFilePath = listOfFiles[i].toString();
            Bitmap bmp = BitmapFactory.decodeFile(imgFilePath);
            ImgMdl imgMdl = new ImgMdl();
            imgMdl.set_itm_txt(getDateString(listOfFiles[i].getName()));
            imgMdl.set_itm_img(bmp);
            list.add(imgMdl);
        }
    }

    return list;
}



public class MainGate_ImgMdl {

private String itm_txt;
private Bitmap itm_img;

public String get_itm_txt() {
    return itm_txt;
}

public void set_itm_txt(String itm_txt) {
    this.itm_txt = itm_txt;
}

public Bitmap get_itm_img() {
    return itm_img;
}

public void set_itm_img(Bitmap itm_img) {
    this.itm_img = itm_img;
}

}

如果我多次打开包含该列表的活动,我有时会得到一个outOfMemoryException。如果我不再需要它,我怎么能释放记忆?完成()没有帮助。

1 个答案:

答案 0 :(得分:2)

首先,在需要之前不要加载图像。假设您在该目录中有100个图像。最有可能的是,用户无法在屏幕上看到全部100个 - 他们必须滚动才能这样做。如果用户没有滚动,则无缘无故地加载了看不见的图像。

其次,请勿加载已加载的图像。如果您“多次打开包含该列表的活动”,并且每次都加载所有图像,那么这是一种浪费,因为您之前加载了许多这些图像。

总体而言,不自行加载图片。有很多image-loading libraries可用,如毕加索和格莱德。一个体面的图像加载库将具有可配置的缓存(解决我的第二点),并知道如何在后台按需加载图像,甚至是ListViewRecyclerView中的行(解决我的第一个问题)点)。