当我不再需要它时,我试图释放记忆,但这似乎并不容易。我创建一个包含一些图像(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。如果我不再需要它,我怎么能释放记忆?完成()没有帮助。
答案 0 :(得分:2)
首先,在需要之前不要加载图像。假设您在该目录中有100个图像。最有可能的是,用户无法在屏幕上看到全部100个 - 他们必须滚动才能这样做。如果用户没有滚动,则无缘无故地加载了看不见的图像。
其次,请勿加载已加载的图像。如果您“多次打开包含该列表的活动”,并且每次都加载所有图像,那么这是一种浪费,因为您之前加载了许多这些图像。
总体而言,不自行加载图片。有很多image-loading libraries可用,如毕加索和格莱德。一个体面的图像加载库将具有可配置的缓存(解决我的第二点),并知道如何在后台按需加载图像,甚至是ListView
或RecyclerView
中的行(解决我的第一个问题)点)。