2012-04-04 46 views
1

内存问题查看分页有很多图像,它可以工作吗?

所以我写一个应用程序应该能够页面通过位于顶部,一个大的640×480的图像和3倍的图像,是被懒惰加载一个画廊的部分详细视图。遵循Google的设计指南,这是他们的建议。由于内存不足,我可以在崩溃之前查看12-13个片段。我认为在这个问题上有几个罪魁祸首。

1.)我正在使用FragmentStatePager。当内存成为问题时,这不应该破坏那些没有被查看的碎片吗?这没有发生。我认为这是自动的。我需要做些什么才能做到这一点?它可能与我如何实现碎片有关吗?我在onCreateView中完成了我所有的Activity配置。为了彻底,我已经包含了这个来源。普通的香草在这里:

public static class MyAdapter extends FragmentStatePagerAdapter { 


     public MyAdapter(FragmentManager fm) { 
      super(fm);    
     } 

     @Override 
     public int getCount() { 
      return NUM_ITEMS; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return InventoryDetailFragment.newInstance(position); 
     } 
    } 

2)我必须不将其在存储器下载是试图找出需要的图像大小的方法。然后在将图像下载到所需大小的同时压缩图像。这没有成功实施。但我不确定发生了什么问题。

private Bitmap downloadBitmap(String url, int width, int height) { 
    Bitmap bitmap = null; 
    int scale = 1; 
    try { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     bitmap = BitmapFactory.decodeStream((InputStream)new URL (url).getContent(), null, options); 

     if (options.outHeight > height || options.outWidth > width) { 
      scale = (int) Math.max(((options.outHeight)/ height), ((options.outWidth)/ width));    } 

     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     bitmap = BitmapFactory.decodeStream((InputStream)new URL (url).getContent(), null, o2); 
     cache.put(url, new SoftReference<Bitmap>(bitmap)); 


    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Error e){ 
     Log.d("TEST", "Garbage Collector called!"); 
     System.gc(); 
    } 
    return bitmap; 
} 

我尝试了一切,我知道该怎么做,但它超出了我对Android/Java的微薄掌握。请帮忙!谢谢!

回答

1

有迹象表明,你需要改变一些东西:

  1. 这是一个可怕的想法:BitmapFactory.decodeStream((InputStream)new URL (url).getContent(), null, options);你从网上各该执行时间(这样获得的图像两次在您发布的代码中)。相反,您需要下载映像并将其缓存在本地。

  2. 只要碎片被分离,就会将逻辑添加到您的碎片中,以在位图上调用recycle()。添加逻辑以在片段连接时始终重新加载映像(从缓存中)。

  3. 最后,您的inSampleSize计算错误。 inSampleSize应该是2的幂的值,例如1,2,4,8。您可以使用对数或简单的二元逻辑,以获得正确的,这就是我使用,这将永远下采样使用至少2(只调用这个,如果你知道该图像是太大):

-

int ratio = (int) Math.max((height/options.outHeight), (width/options.outWidth); //notice that they're flipped  
    for (int powerOfTwo = 64; powerOfTwo >=2; powerOfTwo = powerOfTwo >> 1) { //find the biggest power of two that represents the ratio 
    if ((ratio & powerOfTwo) > 0) { 
     return powerOfTwo; 
    } 
    } 
+0

谢谢了。我实现了第1点和第2点。我排除了3,只是调用了createScaledBitmap来达到我想要的尺寸。我花了一段时间才将重新加载的循环图像重新加载,找出生命周期中的重新加载它们的位置,但感谢你解决了问题! – Rymnel 2012-04-04 18:41:19

0

如果你意识到你的图形与opengl,这将不会计入内存。 另一个ooption是在清单中使用

android:largeHeap="true" 

。可以工作。

您是否使用ddvm搜索内存泄漏?

http://www.youtube.com/watch?v=_CruQY55HOk

+0

太好了。有关如何实现这一目标的任何建议? – Rymnel 2012-04-04 14:19:23

+0

对不起,我还没有opengl开发者,但也许android开发人员有答案? http://developer.android。com/guide/topics/graphics/opengl.html – 2012-04-04 14:37:04

相关问题