2011-11-15 5 views
1

ListActivity에 문제가 있습니다. 검색 결과를 한 번에 5 개씩로드하고 약 45 개 항목에 도달하면 메모리 부족 예외가 발생합니다.long of ListActivity 메모리가 부족합니다.

웹 서버에서 이미지를 비동기 적으로로드합니다. 내가 이것을 언급하면 ​​문제없이 목록의 맨 아래로 스크롤 할 수있다 (aprox 58 개 항목). 비트 맵을 호출하려면 비트 맵을 호출해야한다는 것을 알고 있습니다. 더 이상 사용하지 않는 비트 맵을 gc()로 호출해야합니다.

class ImageLoadingTask extends AsyncTask<String, Void, Bitmap> { 
     private final WeakReference<ImageView> imageViewReference; 
     String         url; 

     public ImageLoadingTask(ImageView imageView) { 
      imageViewReference = new WeakReference<ImageView>(imageView); 
      imageViewReference.get().setImageDrawable(null); 
     } 

     @Override 
     protected void onPostExecute(Bitmap result) { 
      if (isCancelled()) { 
       result = null; 
      } 
      if (imageViewReference != null) { 
       ImageView imageView = imageViewReference.get(); 
       if (imageView != null) {       
        imageView.setImageBitmap(result); 
        //result.recycle(); 
       } 
      } 
     } 

     @Override 
     protected void onPreExecute() { 
      if (imageViewReference != null) { 
       ImageView imageView = imageViewReference.get(); 
       if (imageView != null) { 
        imageView.setImageResource(R.drawable.icon); 
       } 
      } 
     } 

     @Override 
     protected Bitmap doInBackground(String... params) { 
      url = params[0]; 
      return Application.get(getContext()).loadBitmap(url); 
     } 
    } 

onPostExecute 메소드에서 볼 수 있습니다. 이미지가 이미지 뷰에 배치 된 직후에 리사이클을 호출하면 리사이클 된 이미지를 사용하지 않을 것입니다.

아무도 도와 줄 수 있습니까?

사전에 감사합니다, 내 영어에 대한 유감 : P

답변

0

나는 이미지를로드 게으른 좋습니다. 즉, SD 카드에 먼저 다운로드 한 다음 필요에 따라 목록에로드하는 것입니다. 이를 수행하는 방법에 대한 광범위한 토론은 stackoverflow post을 확인하십시오.

+0

나는 그 방법을 구현하려고 시도하고 알려드립니다. 감사. –

+0

감사합니다. 그것은 매력처럼 작동합니다! –

관련 문제