2014-07-24 1 views
0

많은 페이지가있는 응용 프로그램을 가지고 있으며 각 응용 프로그램에는 asynctask를 사용하여 웹에서로드되는 자체 이미지가 있습니다. 문제는 많은 페이지를 열고 닫은 후 얼마 지나지 않아 outofmemory 오류가 발생합니다. 이것을 방지하기 위해 활동을 떠날 때 이미지를 메모리에서 지우는 방법?java.lang.OutOfMemoryError를 방지하기 위해 메모리를 지우는 방법

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
     ImageView bmImage; 

     public DownloadImageTask(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 

     protected Bitmap doInBackground(String... urls) { 
      String urldisplay = urls[0]; 
      Bitmap mIcon11 = null; 
      try { 
       InputStream in = new java.net.URL(urldisplay).openStream(); 
       mIcon11 = BitmapFactory.decodeStream(in); 
      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return mIcon11; 
     } 

     protected void onPostExecute(Bitmap result) { 
      bmImage.setImageBitmap(result); 
     } 
    } 

호출 :

이미지이 AsyncTask를로드하여

new DownloadImageTask((ImageView) findViewById(R.id.ivCard)).execute("http://myurl.com/example.png"); 

활동이 열리고 다른 값과 다른 이미지로 폐쇄된다. 사용자가이 활동의 ​​인스턴스를 종료 한 후

07-24 16:37:57.870 27717-28014/com.yigitserin.hsboard E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1 
    java.lang.RuntimeException: An error occured while executing doInBackground() 
      at android.os.AsyncTask$3.done(AsyncTask.java:299) 
      at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
      at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
      at java.lang.Thread.run(Thread.java:856) 
    Caused by: java.lang.OutOfMemoryError 
      at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:650) 
      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:722) 
      at com.yigitserin.hsboard.HeroActivity$DownloadImageTask.doInBackground(HeroActivity.java:137) 
      at com.yigitserin.hsboard.HeroActivity$DownloadImageTask.doInBackground(HeroActivity.java:125) 
      at android.os.AsyncTask$2.call(AsyncTask.java:287) 
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
            at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
            at java.lang.Thread.run(Thread.java:856) 

어떻게 메모리에서 이미지를 제거 :이 활동의 ​​일부 인스턴스를 연 후, 다음에 OutOfMemory 오류를 준다? 제 생각에는

답변

1

당신은 같은 타사 lib 디렉토리를 사용할 수있다 : - 자동으로 비트 맵 메모리를 유지 LIB 위

Universal Loader

Picasso

URL helper

.

+0

피카소를 사용하여 내 의견으로는 imageviews를위한 최고의 라이브러리. – user3686811

2

비트 맵의 ​​재사용 방법을 호출해야합니다 (예 : onDestroy/onStop 메소드를 활성화하십시오.

내가 당신 finally 블록에서 스트림을 닫고 다음이 우리가 다른 최적화 기술 생각할 수있는 하나의 가능성을 배제 할 수 해봐요 희망을 제공해야한다고 생각 Recycle ImageView's Bitmap

+0

이것은 효과가있다. – user3686811

0

를 참조하십시오.

0

메모리를 "지우지"않고 메모리 부족 예외를 피하기 위해로드중인 Bitmap을 다운 샘플링 할 가능성이 높습니다. 큰 비트 맵 파일을 처리하고로드하는 방법에 대해서는 good tutorials이 있습니다. 예 :

전체 비트 맵을로드하는 대신 메모리에로드하기 전에 이미지의 크기를 줄이고이 문제를 완전히 피할 수 있습니다.

여전히 문제가 발생하는 경우 더 이상 사용하지 않는 많은 이미지에 대한 참조를 유지하는 응용 프로그램이있는 이유에 대해 걱정해야합니다. 페이지가 파괴되면 비트 맵은 앱이 올바르게 설정된 경우 가비지 수집됩니다.

관련 문제