더 이상 필요하지 않을 때 메모리를 확보하려고하지만 쉽지 않습니다. 일부 이미지 (비트 맵)가 포함 된 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을 얻을 것이다 : 이것은 내가 그것을 할 방법이다. 더 이상 필요하지 않으면 어떻게 메모리를 비울 수 있습니까? finish()는 도움이되지 않습니다.
작업을 마치면 비트 맵을 재활용 할 수 있습니다. – Thracian
이미지를 다운로드 할 때'Glide' 라이브러리 또는 Picasso를 사용하십시오. 이러한 라이브러리는 이미지를 처리하기 위해 만들어졌습니다. – Yupi
나는 내 코드를 사용하여 이미지를 다룰 때 문제가 없었습니다. 자신 만의 코드를 사용하여 이미지를 처리 할 수는 있지만 크기가 너무 큰 경우에는 이미지를로드하기 전에 크기를 조정해야합니다. 특히 컨테이너 또는 레이아웃보다 크기가 큰 경우에는 한 번에 메모리에로드하지 말고 완료되면 재활용하십시오. 이 방법으로 게임을 개발했습니다. – Thracian