2017-10-18 3 views
0

더 이상 필요하지 않을 때 메모리를 확보하려고하지만 쉽지 않습니다. 일부 이미지 (비트 맵)가 포함 된 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()는 도움이되지 않습니다.

+1

작업을 마치면 비트 맵을 재활용 할 수 있습니다. – Thracian

+0

이미지를 다운로드 할 때'Glide' 라이브러리 또는 Picasso를 사용하십시오. 이러한 라이브러리는 이미지를 처리하기 위해 만들어졌습니다. – Yupi

+0

나는 내 코드를 사용하여 이미지를 다룰 때 문제가 없었습니다. 자신 만의 코드를 사용하여 이미지를 처리 ​​할 수는 있지만 크기가 너무 큰 경우에는 이미지를로드하기 전에 크기를 조정해야합니다. 특히 컨테이너 또는 레이아웃보다 크기가 큰 경우에는 한 번에 메모리에로드하지 말고 완료되면 재활용하십시오. 이 방법으로 게임을 개발했습니다. – Thracian

답변

2

먼저 이미지가 필요할 때까지로드하지 마십시오. 해당 디렉토리에 100 개의 이미지가 있다고 가정합니다. 대부분 사용자가 화면에서 모두 100을 볼 수는 없습니다. — 스크롤을 수행해야합니다. 사용자가 스크롤하지 않으면 아무 이유없이 보이지 않는 이미지를로드했습니다.

둘째, 이미로드 한 이미지를로드하지 마십시오. "해당 목록을 여러 번 포함하는 활동을 열어", 매번 모든 이미지를로드하는 경우 이전에 많은 이미지를로드 했으므로 낭비입니다.

전체적으로 은 이미지를 직접로드하지 않습니다.. 피카소 (Picasso)와 글라이드 (Glide)와 같이 이용할 수있는 것은 image-loading libraries입니다. 알맞은 이미지 로딩 라이브러리는 구성 가능한 캐시 (두 번째 요점 해결)를 가지고 있으며 ListView 또는 RecyclerView (첫 번째 사항을 다룰 때)의 행에서도 배경에서 주문형 이미지를로드하는 방법을 알고 있습니다.