2015-09-23 3 views
2

я получить строку имени изображения и имеющие для загрузки растрового изображения с сервера Для получения строки имени изображения Фрона данных JSON и скачать по этой ссылке:Загрузка изображений с несколькими потоками вызывает OutOfMemory исключения

Строки str_ImgURL_bmp_pattern = "http://xxxx/xxx/MobileService.svc/DownloadFile/FileName/" + imageName; download_PngFile (str_ImgURL_bmp_pattern);

void download_PngFile(String fileUrl) { 
     Log.e("In download_PngFile ", " str_imgList_imageaudioPath = " + imageName); 
     Bitmap imagenObtenida = null; 
     try { 
      URL ImgUrl = new URL(fileUrl); 
      HttpURLConnection conn = (HttpURLConnection) ImgUrl.openConnection(); 
      conn.connect(); 
      imagenObtenida = BitmapFactory.decodeStream(conn.getInputStream()); 
      //Log.e("imagenObtenida", " = " + imagenObtenida); 

      String fotoname = imageName; 
      File file = new File(newFolder, fotoname); 
      int sizeOfImage = (int) file.length(); 
      Log.e("sizeOfImage ", " = " + sizeOfImage + "@ " + imageName); 
      if (file.exists()) file.delete(); 
      try { 
       FileOutputStream out = new FileOutputStream(file); 
       imagenObtenida.compress(Bitmap.CompressFormat.PNG, 100, out); 
       out.flush(); 
       out.close(); 
       // Log.e("Png = ", "DownLoad complete"); 

      } catch (Exception e) { 

      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

Но это некоторые изображения загружаются и после некоторого времени сбоя приложения, и я получаю ошибку в заголовке в logcat.

java.lang.RuntimeException: An error occured while executing doInBackground() 
      at android.os.AsyncTask$3.done(AsyncTask.java:278) 
      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:208) 
      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:493) 
      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:549) 
      at com.example.tazeen.classnkk.AllPosts_Page.download_PngFile(AllPosts_Page.java:896) 
      at com.example.tazeen.classnkk.AllPosts_Page.getDoenLoaddata(AllPosts_Page.java:820) 
      at com.example.tazeen.classnkk.AllPosts_Page$GetgetAllImagePath_List.doInBackground(AllPosts_Page.java:781) 
      at com.example.tazeen.classnkk.AllPosts_Page$GetgetAllImagePath_List.doInBackground(AllPosts_Page.java:771) 
      at android.os.AsyncTask$2.call(AsyncTask.java:264) 
      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:208) 
            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) 

Ошибка в этой строке: imagenObtenida = BitmapFactory.decodeStream (conn.getInputStream());

Как решить эти проблемы.

+0

Попробуйте обратиться к этому [ответ] [1]. Это может вам помочь. [1]: http://stackoverflow.com/questions/14051068/java-lang-outofmemoryerror-in-android-while-getting-image-from-gallery-in-androi – Jas

+0

Вы загрузки нескольких изображения одновременно? – FlanschiFox

+0

Да, одновременно загружая несколько изображений. – androidTag

ответ

1

Так что в основном исключение довольно ясно. Вы потеряли память.

Есть несколько возможных решений:

1. Шкала вниз изображений:

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 2; 
Bitmap imagenObtenida = BitmapFactory.decodeStream(conn.getInputStream(), null, options); 

Это необходимо, если даже один загрузки изображения приводит к сбою.

2. Не декодировать одновременно

Так что не использовать а ThreadPoolExecutor

3. Комбинации Например:

-JUST использования 2 параллельных потоков

-Открыть доступную память и установить номер потока, который соответствует текущей памяти

-catch из памяти исключений и ждать до конца резьбы

Смежные вопросы