Java android从url下载位图遇到内存不足异常

Java android从url下载位图遇到内存不足异常,java,android,bitmap,android-asynctask,bitmapfactory,Java,Android,Bitmap,Android Asynctask,Bitmapfactory,我正在构建一些应用程序,从url加载图像,当用户向下滚动应用程序时,下载更多图像 大约30次下载后,我的内存出现异常。我在这里和安卓开发者中读到了关于它的信息,但我找不到一种方法让它运行 这是我下载图像的代码: for (int k = 0; k < pictureAry.length(); k++) { try { URL url = new URL(picUrl + pictureAry.getSt

我正在构建一些应用程序,从url加载图像,当用户向下滚动应用程序时,下载更多图像

大约30次下载后,我的内存出现异常。我在这里和安卓开发者中读到了关于它的信息,但我找不到一种方法让它运行

这是我下载图像的代码:

for (int k = 0; k < pictureAry.length(); k++) {
                    try {
                        URL url = new URL(picUrl + pictureAry.getString(k)
                                + "/230");
                        HttpURLConnection connection = (HttpURLConnection) url
                                .openConnection();
                        connection.setDoInput(true);
                        connection.connect();
                        InputStream input = connection.getInputStream();
                        Bitmap myBitmap = BitmapFactory.decodeStream(input);
                        picArrayList.add(myBitmap);
                        break;

                    } catch (IOException e) {
                        Bitmap myBitmap = BitmapFactory.decodeResource(
                                context.getResources(),
                                R.drawable.icon_0404);
                        picArrayList.add(myBitmap);
                    }
                }
这不是写在这里,但我尝试使用bitmapFactory.options,但我得到了堆栈可能是因为我的源是Url而不是文件

这是日志目录:

06-27 12:30:10.008:E/dalvikvm11265:内存不足:堆大小=98304KB,分配=92688KB,限制=98304KB,过程限制=98304KB 06-27 12:30:10.008:E/dalvikvm11265:额外信息:封装外形=97504KB,允许的封装外形=98304KB,修剪过的封装外形=1588KB 06-27 12:30:10.013:E/Bitmap_JNI11265:创建位图失败。 06-27 12:30:10.013:E/Bitmap_JNI11265:无法创建SkBitmap! 06-27 12:30:10.013:W/dalvikvm11265:threadid=16:thread退出时未捕获异常组=0x41991a08 06-27 12:30:10.013:E/AndroidRuntime11265:致命异常:异步任务5 06-27 12:30:10.013:E/AndroidRuntime11265:java.lang.RuntimeException:执行doInBackground时出错 06-27 12:30:10.013:E/AndroidRuntime11265:at android.os.AsyncTask$3.doneAsyncTask.java:299 06-27 12:30:10.013:E/AndroidRuntime11265:at java.util.concurrent.FutureTask.finishCompletionFutureTask.java:352 06-27 12:30:10.013:E/AndroidRuntime11265:at java.util.concurrent.FutureTask.setExceptionFutureTask.java:219 06-27 12:30:10.013:E/AndroidRuntime11265:at java.util.concurrent.FutureTask.runFutureTask.java:239 06-27 12:30:10.013:E/AndroidRuntime11265:at android.os.AsyncTask$SerialExecutor$1.runAsyncTask.java:230 06-27 12:30:10.013:E/AndroidRuntime11265:at java.util.concurrent.ThreadPoolExecutor.runWorkerThreadPoolExecutor.java:1080 06-27 12:30:10.013:E/AndroidRuntime11265:at java.util.concurrent.ThreadPoolExecutor$Worker.runThreadPoolExecutor.java:573 06-27 12:30:10.013:E/AndroidRuntime11265:at java.lang.Thread.runThread.java:864 06-27 12:30:10.013:E/AndroidRuntime11265:原因:java.lang.OutOfMemoryError:堆大小=98304KB,已分配=92688KB 06-27 12:30:10.013:E/AndroidRuntime11265:at android.graphics.Bitmap.nativeCreateScaledBitmapNative方法 06-27 12:30:10.013:E/AndroidRuntime11265:at android.graphics.Bitmap.createScaledBitmapBitmap.java:809 06-27 12:30:10.013:E/AndroidRuntime11265:at com.gy.bll.JsonParser.makeGuiRowJsonParser.java:516 06-27 12:30:10.013:E/AndroidRuntime11265:at com.gy.bll.JsonParser.access$1JsonParser.java:332 06-27 12:30:10.013:E/AndroidRuntime11265:com.gy.bll.JsonParser$jsonPostAsyncTask.doInBackgroundJsonParser.java:299 06-27 12:30:10.013:E/AndroidRuntime11265:com.gy.bll.JsonParser$jsonPostAsyncTask.doInBackgroundJsonParser.java:1 06-27 12:30:10.013:E/AndroidRuntime11265:at android.os.AsyncTask$2.callAsyncTask.java:287 06-27 12:30:10.013:E/AndroidRuntime11265:at java.util.concurrent.FutureTask.runFutureTask.java:234 06-27 12:30:10.013:E/AndroidRuntime11265:。。。4更多

目前,我在我的清单中使用了android:largeHeap=true,它使我的应用程序不会崩溃,但我在日志中看到heep grwos达到了250m+并且它使我的应用程序运行缓慢

谢谢

您可以使用图像缩放机制。 不要每次都尝试下载。如果一旦下载,则将其存储到缓存中。
请在代码块中发布logcat,因为现在行会自动换行并使其无法读取。此外,将所有位图放在一个列表中是一个坏主意。这样的话,你需要大量的内存,你的内存就会耗尽。最好先将它们保存到文件中。也不要使用BitmapFactory,因为它会首先将整个文件放入内存中。只需使用您自己的inputstream/fileoutputstream并在循环中读取/写入缓冲区。如果您需要在例如getView中使用位图,请从文件中加载它们。如果需要,你可以调整它们的大小。我清除每个循环的列表,这样每个循环只有1-3个图像。我不知道如何制作你刚才说的输入流/文件输出流。。你能给我举个例子吗。如何使用此机制?这与Bitmap.createScaledBitmap有什么不同?你是什么意思?我每次都要下载很多不同的图片。。我的问题是我使用了很多缓存,所以我不认为这是解决方案…对于1.,我不认为你可以在下载时缩放图像,也许可以使用一些交错格式作为一种攻击,但不是一般的。对于2,我想你指的是文件系统,而不是内存。@GiliYaniv在arraylist中保存所有位图对象。而不是像我说的那样,你必须存储位图对象。。我清除了arraylist的每个循环。。您建议我如何将位图转移到其他方法?
enter codeint bwidth = picArrayList.get(0).getWidth();
                int bheight = picArrayList.get(0).getHeight();
                int swidth = mainTableForAllPosts.getWidth();
                int sheight = mainTableForAllPosts.getHeight();
                int new_width = swidth;
                int new_height = (int) Math.floor((double) bheight
                        * ((double) new_width / (double) bwidth));                  
                newbitMap = Bitmap.createScaledBitmap(
                        picArrayList.get(0), new_width, new_height, true);
                mainImageView.setImageBitmap(newbitMap);

            } else
                mainImageView
                        .setImageBitmap(overlay(bitmapForVideoThumbnails));
        } catch (Exception e) {
            mainImageView.setImageResource(com.gy.bll.R.drawable.icon_0404);

        }