2013-02-23 55 views
3

我實現了一個ViewPager,它給我一個內存不足的錯誤,我不明白爲什麼。我有大約11個圖像顯示,每個圖像大約500 kb(磁盤大小),它們是.jpg格式。ViewPager給出內存不足錯誤

下面是代碼:

public class MainActivity extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_bmw_gallery); 

ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager); 
ImagePagerAdapter adapter = new ImagePagerAdapter(); 
viewPager.setAdapter(adapter); 
} 

private class ImagePagerAdapter extends PagerAdapter { 
private int[] mImages = new int[] { 
    R.drawable.bmw_1series_3door_wallpaper_01, 
    R.drawable.bmw_1series_3door_wallpaper_02, 
    R.drawable.bmw_1series_3door_wallpaper_03, 
    R.drawable.bmw_1series_3door_wallpaper_04, 
    R.drawable.bmw_1series_3door_wallpaper_05, 
    R.drawable.bmw_1series_3door_wallpaper_06, 
    R.drawable.bmw_1series_3door_wallpaper_07, 
    R.drawable.bmw_1series_3door_wallpaper_08, 
    R.drawable.bmw_1series_3door_wallpaper_09, 
    R.drawable.bmw_1series_3door_wallpaper_11, 
    R.drawable.bmw_1series_3door_wallpaper_12 
}; 

@Override 
public int getCount() { 
    return mImages.length; 
} 

@Override 
public boolean isViewFromObject(View view, Object object) { 
    return view == ((ImageView) object); 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    Context context = MainActivity.this; 
    ImageView imageView = new ImageView(context); 
    imageView.setAdjustViewBounds(true); 

    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 

    imageView.setImageResource(mImages[position]); 
    ((ViewPager) container).addView(imageView, 0); 
    return imageView; 
} 


@Override 
public void destroyItem(View collection, int position, Object o) { 
    View view = (View)o; 
    ((ViewPager) collection).removeView(view); 
    view = null; 
} 


} 



} 

什麼我做錯了還是什麼,從我的代碼失蹤?

+0

「500kb」是指磁盤上的大小,或RAM中的解碼大小? – CommonsWare 2013-02-23 18:45:50

+0

參考磁盤上的大小 – 2013-02-23 18:50:04

回答

4

我在這裏找到了解決方案:http://developer.android.com/training/displaying-bitmaps/index.html 我剛剛在我的內部實現了BitmapFun項目。通過這種方式,應用程序運行起來非常好,而且我不再遇到內存不足錯誤。

+0

您是否可以在不使用片段的情況下共享其示例?只是一個簡單的視圖與您使用的代碼? – 2014-01-22 06:52:51

10

磁盤上的500KB JPEG圖像將佔用比這更多的堆空間。

例如,我在這裏有一張494KB的數碼照片,分辨率爲1455 x 1029.如果我將它加載到Android應用程序中,它將消耗1455x1029x3 = 4.3MB的堆空間。如果您有11個具有相似特徵的圖像,則它們將消耗> 40MB。大多數設備每個進程有16-32MB的堆空間。

如果您想運送11個可繪製的資源(在這種情況下,可能會讓您被寶馬控告的圖像),您將需要更小的圖像。

+0

由於該應用不會在MarketPlace上發佈,因此不用擔心被寶馬起訴,這只是我的一個項目。 – 2013-02-23 19:00:30

+0

因此,讓它使用更少資源並且不會出現該錯誤的唯一機會是修改磁盤上的大小? – 2013-02-23 19:02:14

+0

@CatalinH:假設你想使用drawable資源,是的。更準確地說,您需要較低分辨率的圖像。問題是,AFAIK,你不能從內存驅逐資源。如果這些圖像是文件系統上的文件,並且您正在使用「BitmapFactory」加載它們,那麼您可能有更多的選擇來確保位圖內存被重用(請參見'BitmapFactory.Options'中的'inBitmap'),哪種情況下你會更好地控制你的內存消耗。但是,這使得一個更復雜的應用程序。 – CommonsWare 2013-02-23 19:04:24

2

我在viewpager中顯示高分辨率圖像時遇到了同樣的問題。我已經搜索並應用了所有在http://developer.android.com/training/displaying-bitmaps/index.html中給出的android位圖解決方案和下面的鏈接中的高速緩存mekanism。但他們都沒有工作。在任何地方都不是任

然後我發現問題是:我不能使用可繪製的文件夾結構。我在mdpi和hdpi文件夾中保存高分辨率圖像。這導致android將圖像放大到超大尺寸。由於android監視器/內存部分,100 kb圖像導致內存增加20 mb。 所以我已經將這些超分辨率的圖像添加到xxhdpi文件夾,然後突然被固定。那麼我的圖像滑塊完美地與高分辨率的圖像工作

+1

哥們你真是個奇蹟。 這個活動有缺點嗎? – kksal55 2017-06-10 01:37:36

+1

@ kksal55謝謝我的朋友。我還沒有看到一個缺點 – smoothumut 2017-06-13 11:01:55