android - 使用多个线程下载图像会导致 OutOfMemory 异常

标签 android multithreading download out-of-memory

我正在检索图像名称的字符串并且必须从服务器下载位图 要从 JSON 数据中获取图像名称字符串并使用此链接下载:

String str_ImgURL_bmp_pattern = "http://xxxx/xxx/MobileService.svc/DownloadFile/FileName/ "+ imageName; 下载_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());

如何解决这个问题。

最佳答案

所以基本上异常是很清楚的。 你的内存力不足。

有一些可能的解决方案:

<强>1。缩小图像:

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

这是必需的,即使是单个图像下载也会导致崩溃。

<强>2。不要同时解码

所以不要使用ThreadPoolExecutor

<强>3。组合 例如:

-只需使用 2 个并行线程

-检查可用内存并设置适合当前内存的线程号

-捕获内存不足异常并等待其他线程完成

关于android - 使用多个线程下载图像会导致 OutOfMemory 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32731183/

相关文章:

android - 如何支持我的 Android 应用程序在多个 Android 商店中使用?

java - 因果关系示例执行

Spring - 下载文件并重定向

android - 在android studio中禁用突出显示的变量

android - ImageView.setImageBitmap 为空白

java - 如何实时读写一个进程并在JTextArea中实时显示输出? (Java Swing )

ios - 是否建议在 iOS 的另一个后台线程中启动一个后台线程

android - 从照片 Lollipop Android 打开图像

file - IE6 "helpfully"将后缀附加到下载的文件

android - Sherlock 排除了哪些库?