2015-10-13 52 views
-1

在这里,我通过dalvikvm堆的一个.Getting错误下载从服务器的一个图像:在31961104字节分配时内存运行应用程序,并在中途坠毁。一段时间图像下载某个not.But我想从下载列表视图中添加图像..安卓:dalvikvm堆:内存

这里是我的下载代码

private Bitmap downloadBitmap(String url) { 

      final DefaultHttpClient client = new DefaultHttpClient(); 

      final HttpGet getRequest = new HttpGet(url); 
      try { 
       HttpResponse response = client.execute(getRequest); 

       //check 200 OK for success 
       final int statusCode = response.getStatusLine().getStatusCode(); 

       if (statusCode != HttpStatus.SC_OK) { 
        Log.w("ImageDownloader", "Error " + statusCode + 
          " while retrieving bitmap from " + url); 
        return null; 
       } 
       final HttpEntity entity = response.getEntity(); 
       if (entity != null) { 
        InputStream inputStream = null; 
        try { 
         // getting contents from the stream 
         inputStream = entity.getContent(); 

         // decoding stream data back into image Bitmap that android understands 
         BitmapFactory.Options options = new BitmapFactory.Options(); 
         options.inSampleSize = 1; 
         final Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options); 
         // final Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 

         File file = new File(newFolder, imageName); 

         if (file.exists()) file.delete(); 
         try 
         { 
          FileOutputStream out = new FileOutputStream(file); 
          bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); 
          out.flush(); 
          out.close(); 
          int imagenObtenidaW = bitmap.getWidth(); 
          int imagenObtenidaH = bitmap.getHeight(); 
          Log.e("imagenObtenidaW " ," = +" + imagenObtenidaW + " imagenObtenidaH = " + imagenObtenidaH); 

         } catch (Exception e) { 

         } 

         return bitmap; 
        } finally { 
         if (inputStream != null) { 
          inputStream.close(); 
         } 
         entity.consumeContent(); 
        } 
       } 
      } catch (Exception e) { 
       // You Could provide a more explicit error message for IOException 
       getRequest.abort(); 
       Log.e("ImageDownloader", "Something went wrong while" + 
         " retrieving bitmap from " + url + e.toString()); 
      } 
      return null; 
     } 

    here is my code form download in the same Activity. 

    if (imageName.endsWith(png_Pattern) || imageName.endsWith(jpg_pattern) || imageName.endsWith(bmp_pattern) || imageName.endsWith(gif_pattern) || imageName.endsWith(jpeg_pattern)) 
         { 

          str_DownLoadUrl = namespace + "/DownloadFile/FileName/" + imageName; 
          Log.e("@@@@@", "str_DownLoadUrl = " + str_DownLoadUrl); 
          //download_PngFile(str_DownLoadUrl); 
          downloadBitmap(str_DownLoadUrl); 
          strDownLoadStatus = "1"; 
          dbhelper.update_DownLoadStatus(imageName, strDownLoadStatus); 
         } 
        } 

这里是我的logcat

1.414 10598-10601/com.example.tazeen.classnkk D/dalvikvm﹕ GC_CONCURRENT freed 1738K, 57% free 15379K/35335K, paused 5ms+7ms 
10-13 14:52:11.963 10598-10826/com.example.tazeen.classnkk D/dalvikvm﹕ GC_FOR_ALLOC freed 64K, 57% free 15377K/35335K, paused 95ms 
10-13 14:52:11.963 10598-10826/com.example.tazeen.classnkk I/dalvikvm-heap﹕ Forcing collection of SoftReferences for 31961104-byte allocation 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk D/dalvikvm﹕ GC_BEFORE_OOM freed 9K, 57% free 15368K/35335K, paused 68ms 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk E/dalvikvm-heap﹕ Out of memory on a 31961104-byte allocation. 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ "AsyncTask #2" prio=5 tid=13 RUNNABLE 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ | group="main" sCount=0 dsCount=0 obj=0x42ad4188 self=0x1edbd8 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ | sysTid=10826 nice=10 sched=0/0 cgrp=bg_non_interactive handle=1591808 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ | schedstat=(12449561867 3389288161 878) utm=1181 stm=63 core=0 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at com.example.tazeen.classnkk.AllPosts_Page.downloadBitmap(AllPosts_Page.java:1220) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at com.example.tazeen.classnkk.AllPosts_Page.getDoenLoaddata(AllPosts_Page.java:738) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at com.example.tazeen.classnkk.AllPosts_Page$GetgetDoenLoaddata.doInBackground(AllPosts_Page.java:700) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at com.example.tazeen.classnkk.AllPosts_Page$GetgetDoenLoaddata.doInBackground(AllPosts_Page.java:696) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at android.os.AsyncTask$2.call(AsyncTask.java:264) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ at java.lang.Thread.run(Thread.java:856) 
10-13 14:52:12.034 10598-10826/com.example.tazeen.classnkk I/dalvikvm﹕ [ 10-13 14:52:12.034 10598:0x2a4a D/skia  ] 
    --- decoder->decode returned false 

如何解决这个问题。

+0

的完整链接的android:largeHeap = “真” 做u设置此清单文件? –

+0

为什么不使用图像加载库在列表视图中添加图像? –

+1

加入'android:largerHeap =“true”'不是管理这个问题的正确方法。 –

回答

0

这个问题,当你正在下载图像,并没有留下记忆这是下载一些图片后,分配给您的应用程序出现。有各种不同的图像加载库,使您的工作更容易:FrescoPicassoGlide

  1. 相比,我建议你通过Facebook的是Fresco是相当真棒和成熟结账图像管理库到其他图像加载库。

  2. 壁画具有SimpleDraweeView作为支持Rounded Corners and Circleslink并支持动画自定义图像视图(.GIF,.WEBP)以及正常图像(.JPG,.PNG)。

  3. 壁画处理3层架构(BITMAP_MEMORY_CACHE,ENCODED_MEMORY_CACHEDISK_CACHE)缓存图像的所有内容。它也减少了OOM(内存不足)问题。当视图中的图像超出屏幕时,它会自动回收位图,从而释放内存。

您可以通过在清单中添加android:largeHeap="true"来增加分配给应用程序的内存。

注:增加heap为您的应用程序不被认为是一个理想的解决方案。

下面是来自谷歌的提取物来解释它,

然而,要求一大堆的能力仅用于一 小集合的应用程序,可以证明需要消耗更多的RAM(例如 作为一个大型照片编辑应用程序)。千万不要简单地请求大堆,因为内存不足,需要快速修复 - 只有当您确切知道分配了所有内存的位置以及必须保留的原因时,您才应该使用 。但是,即使您对自己的应用程序有足够的信心,也可以在任何可能的范围内尽可能避免向 发送请求。使用额外的内存将日益成为 到整体用户体验的损害,因为垃圾收集 将需要更长的时间和系统性能可能会较慢时 任务切换或执行其他常见操作。

这里的文档https://developer.android.com/training/articles/memory.html