从资源获取的异常大图 [英] Large image from resource get exception
问题描述
我按照这个链接的例子:
Viewpager实例的Android
其工作正常,但当我把我自己的高分辨率图像(尺寸大),它给了我异常:
java.lang.OutOfMemoryError:位图的大小超过VM预算
我张贴关于一个老问题,但它关闭怎么把它复制出于这个原因,我想和搜查了很多,终于让我找到了解决办法是:扩大我的图片按照以避免内存异常:
笔者的咨询和解答在这里stackfllow和Android开发网站,我用波纹管code,其中也有同样的异常结束而结束,我认为这是我的code怎么把即时通讯一些错误仍然在学习java和android开发,但我可以请任何帮助或建议,年底将AP preciated,
感谢。
我的code:
ViewPagerAdapter
公共类ViewPagerAdapter扩展PagerAdapter {活动活动;
INT imageArray [];公共ViewPagerAdapter(活动行为,INT [] imgArra){
imageArray = imgArra;
活性=行为;
}公众诠释的getCount(){
返回imageArray.length;
}公共对象instantiateItem(查看收集,INT位置){
ImageView的观点=新ImageView的(活动);
view.setLayoutParams(新的LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
view.setScaleType(ScaleType.FIT_XY);
view.setBackgroundResource(imageArray [位置]);
((ViewPager)集合).addView(查看,0);
返回视图。
}@覆盖
公共无效destroyItem(查看为arg0,ARG1 INT,对象ARG2){
((ViewPager)为arg0).removeView((查看)ARG2);
}@覆盖
公共布尔isViewFromObject(查看为arg0,ARG1对象){
返回将arg0 ==((查看)ARG1);
}@覆盖
公共Parcelable saveState和(){
返回null;
}
公共静态位图德codeSampledBitmapFromResource(字符串imageArra,
INT reqWidth,诠释reqHeight){ //首先去code。与inJustDe codeBounds = true来检查尺寸
最后BitmapFactory.Options选项=新BitmapFactory.Options();
options.inJustDe codeBounds = TRUE;
BitmapFactory.de codeFILE(imageArra,期权); //计算inSampleSize
options.inSampleSize = calculateInSampleSize(选项,reqWidth,reqHeight); //德code位与inSampleSize集
options.inJustDe codeBounds = FALSE;
返回BitmapFactory.de codeFILE(imageArra,期权);
}
公共静态INT calculateInSampleSize(
BitmapFactory.Options选项,诠释reqWidth,诠释reqHeight){
//原始高度和图像宽度
最终诠释身高= options.outHeight;
最终诠释宽度= options.outWidth;
INT inSampleSize = 1; 如果(高度> reqHeight ||宽度GT; reqWidth){
如果(宽>高度){
inSampleSize = Math.round((浮点)高度/(浮点)reqHeight);
}其他{
inSampleSize = Math.round((浮点)宽/(浮点)reqWidth);
}
}
返回inSampleSize;}}
PageIndicatorActivity
公共类PageIndicatorActivity延伸活动{@覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
ViewPagerAdapter适配器=新ViewPagerAdapter(这一点,imageArra);
ViewPager myPager =(ViewPager)findViewById(R.id.myfivepanelpager);
myPager.setAdapter(适配器);
myPager.setCurrentItem(0);
}私人诠释imageArra [] = {R.drawable.one,R.drawable.two,
R.drawable.three,R.drawable.four,
R.drawable.five,R.drawable.six,
R.drawable.seven,R.drawable.eight,R.drawable.nine,
R.drawable.ten}; }
logcat的堆栈
致命异常:主要
java.lang.OutOfMemoryError:位图大小超过VM预算
在android.graphics.BitmapFactory.nativeDe $ C $检测板(本机方法)
在android.graphics.BitmapFactory.de codeStream(BitmapFactory.java:563)
在android.graphics.BitmapFactory.de codeResourceStream(BitmapFactory.java:439)
在android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
在android.content.res.Resources.loadDrawable(Resources.java:1709)
在android.content.res.Resources.getDrawable(Resources.java:581)
在android.view.View.setBackgroundResource(View.java:7586)
在com.horizontalscrollviewwithpageindicator.ViewPagerAdapter.instantiateItem
(ViewPagerAdapter.java:33)
在android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
在android.support.v4.view.ViewPager.addNewItem(ViewPager.java:692)
在android.support.v4.view.ViewPager.populate(ViewPager.java:875)
在android.support.v4.view.ViewPager.populate(ViewPager.java:772)
在android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1234)
在android.view.View.measure(View.java:8366)
在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
在android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
在android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
在android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
在android.view.View.measure(View.java:8366)
在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
在android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
在android.view.View.measure(View.java:8366)
在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
在android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
在android.view.View.measure(View.java:8366)
在android.view.ViewRoot.performTraversals(ViewRoot.java:844)
在android.view.ViewRoot.handleMessage(ViewRoot.java:1865)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:123)
在android.app.ActivityThread.main(ActivityThread.java:3687)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:507)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:842)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
在dalvik.system.NativeStart.main(本机方法)
您从来没有使用的方法来缩放图片,也是你inSampleSize必须是二的幂(我相信)。这些图像是太大了(您在previous后表示4.5 MB)。上存储了巨大的位图的顶部,视图寻呼机保持在任何给定时间在存储器3次。分配给您的视图寻呼机你的内存是一样的东西> 13.5MB。用以下替换您的实例化视图:
ImageView的MyView的=新ImageView的(上下文);
BitmapFactory.Options选项=新BitmapFactory.Options();
options.inSampleSize = 4;位图位图= BitmapFactory.de codeResource(activity.getResouces(),imageArray [位置]选项);
myView.setImageBitmap(位图);((ViewPager)视图).addView(MyView的);返回MyView的;
如果这还提供了一个错误,请使用options.inSampleSize = 8;
I follow the example in this link : Viewpager Example in android
its work fine but when i placed my own high resolution images (large in size ), it gave me exception :
java.lang.OutOfMemoryError: bitmap size exceeds VM budget.
i post an old question about that but it closed coz its duplicated for that reason , i tried and searched alot, finally i found the solution which is : scaling my images to avoid memory exception by following :
author advice and answers here in stackfllow and android development site , i ended with the bellow code , which also end with same exception, i think there is some wrong in my code coz im still learning java and android development , but that what i can end with , please any help or advice will be appreciated ,
thanks .
my code:
ViewPagerAdapter
public class ViewPagerAdapter extends PagerAdapter {
Activity activity;
int imageArray[];
public ViewPagerAdapter(Activity act, int[] imgArra) {
imageArray = imgArra;
activity = act;
}
public int getCount() {
return imageArray.length;
}
public Object instantiateItem(View collection, int position) {
ImageView view = new ImageView(activity);
view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
view.setScaleType(ScaleType.FIT_XY);
view.setBackgroundResource(imageArray[position]);
((ViewPager) collection).addView(view, 0);
return view;
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView((View) arg2);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == ((View) arg1);
}
@Override
public Parcelable saveState() {
return null;
}
public static Bitmap decodeSampledBitmapFromResource(String imageArra,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageArra, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(imageArra, options);
}
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float)height / (float)reqHeight);
} else {
inSampleSize = Math.round((float)width / (float)reqWidth);
}
}
return inSampleSize;}}
PageIndicatorActivity:
public class PageIndicatorActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPagerAdapter adapter = new ViewPagerAdapter(this, imageArra);
ViewPager myPager = (ViewPager) findViewById(R.id.myfivepanelpager);
myPager.setAdapter(adapter);
myPager.setCurrentItem(0);
}
private int imageArra[] = { R.drawable.one, R.drawable.two,
R.drawable.three, R.drawable.four,
R.drawable.five, R.drawable.six,
R.drawable.seven, R.drawable.eight,R.drawable.nine,
R.drawable.ten }; }
logcat stack :
FATAL EXCEPTION: main
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:563)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:439)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
at android.content.res.Resources.loadDrawable(Resources.java:1709)
at android.content.res.Resources.getDrawable(Resources.java:581)
at android.view.View.setBackgroundResource(View.java:7586)
at com.horizontalscrollviewwithpageindicator.ViewPagerAdapter.instantiateItem
(ViewPagerAdapter.java:33)
at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:692)
at android.support.v4.view.ViewPager.populate(ViewPager.java:875)
at android.support.v4.view.ViewPager.populate(ViewPager.java:772)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1234)
at android.view.View.measure(View.java:8366)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
at android.view.View.measure(View.java:8366)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
at android.view.View.measure(View.java:8366)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
at android.view.View.measure(View.java:8366)
at android.view.ViewRoot.performTraversals(ViewRoot.java:844)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1865)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
You never use the method to scale the images, also your inSampleSize needs to be a power of two(i believe). These images are way too big (4.5 mb that you stated in your previous post). On top of a huge bitmap being stored, the view pager keeps 3 views in memory at any given time. Your memory allocated for your view pager is something like >13.5mb. Replace your instantiate view with the following:
ImageView myView = new ImageView(context);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeResource(activity.getResouces(), imageArray[position], options );
myView.setImageBitmap(bitmap);
((ViewPager) view).addView(myView);
return myView;
If this still provides an error, use options.inSampleSize = 8;
这篇关于从资源获取的异常大图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!