2012-11-30 155 views
4

我有一个滚动视图,它具有通过AsyncTask加载的图像的小缩略图并将图像URL引发至imageView。内存不足加载图像查看

它们被动态添加,然后在上面,是一个主要的图像查看,它包含了你点击的缩略图的图像。

一切都运行很好,直到你在缩略图约10+图片...

我通过相同的方式,缩略图加载mainImage网址,因此,当他们点击拇指的图像,它加载它最高。

我回收方法本身的位图,但它似乎是运行内存和崩溃装载超过10张图像(缩略图加载OK,但是当我点击崩溃加载主图像)

任何帮助赞赏

这是我使用的负荷图像(缩略图+主)代码:你可能有某种的位图缓存策略的工作

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); 
    } 
    } 

回答

0

,尝试有一个看图书馆Universal Image Loader,它都非常好,你需要什么自己

回收位图时你肯定知道,它不会再被使用时才需要这样做。

1

只是实现此乌尔图像上...这将通过4次

public static Bitmap getImage(byte[] image) { 
     BitmapFactory.Options config = new BitmapFactory.Options(); 
     config.inPreferredConfig = Bitmap.Config.RGB_565; 
     config.inSampleSize = 4; 
     return BitmapFactory.decodeByteArray(image, 0, image.length,config); 

    } 
0

尝试减少乌尔图像调整大小的位图,以更小的尺寸(与因子样1.5例如:宽度= WIDT * 1.5 ) 然后在您的视图中拉伸(适合xy或其他)。由于您决定的因素,它会降低图像的质量。这是一个快速肮脏的方式。还像牛啊哥哥那样制作位图rgb的作品很好。

1

你应该阅读以下两个Android官方教程。他们会教你如何有效地加载大位图,以及它们提供我们所使用的工作代码示例在我们的生产应用

Displaying Bitmaps Efficiently

Loading Large Bitmaps Efficiently

+0

我应该注意到,图像非常小(都在50-60kb之间)我认为我要检查以确保它看到相同的尺寸,而不是使用荒谬的内存量 - – sykal

1

您不关闭输入流。所以所有的时候,图像网址执行输入流对象创建,这是昂贵的,并导致你OutofMemoryError。 catch块后添加下面的代码。

in.close(); 
in = null; 
+0

关闭所有开放的东西是一个好主意,但流不会将数据保存在内存中。他们将数据从输入传递到输出。他们也会被垃圾收集在这里,因为'in'在'try'之后超出范围' – zapl

0

您不应该为此使用ScrollView。你应该使用一个ListView。当您使用滚动型(带的LinearLayout或类似的东西里面),在列表中(不管它有多大),所有元素将尝试立即被加载。尝试一个ListView,而不是(这对于确切原因做,只加载到内存时可见行的UI元素)。

+0

我真的很想将图像保留在滚动视图中,尽管因为让用户滚动缩略图很容易 - – sykal

+0

如果你设置为使用scrollview进行此操作时,您需要以某种方式实现缓存行。为了解释我的意思,看看[这里](http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/)。关于构建自己的listview的非常好的指南可以在这里找到(http://developer.sonymobile.com/2010/05/20/android-tutorial-making-your-own-3d-list-part-1/ )和[这里](http://developer.sonymobile.com/2010/05/31/android-tutorial-making-your-own-3d-list-part-2/)。 –

0

可以使用Android:largeHeap = “true” 将要求更大的堆大小

answer

0

我用这个..

Options opt = new Options(); 
opt.inPurgeable = true; 
opt.inInputShareable = true; 
opt.inPreferredConfig = Bitmap.Config.RGB_565;