Tôi đang làm việc trên ứng dụng gamebook hiển thị 12 chế độ xem trong ViewPager. Đây là PagerAdapter tùy chỉnh của tôi:Android setBackgroundNguồn nguyên nhân ngoài bộ nhớ excepiton
private class ImagePagerAdapter extends PagerAdapter {
private int[] mImages = new int[] { R.drawable.copertinai,
R.drawable.blui, R.drawable.azzurroi, R.drawable.rossoi,
R.drawable.gialloi, R.drawable.verdei, R.drawable.rosai,
R.drawable.grigioi, R.drawable.neroi, R.drawable.arancionei,
R.drawable.marronei, R.drawable.violai, R.drawable.ulm };
@Override
public int getCount() {
return mImages.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((RelativeLayout) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Context context = MainActivity.this;
RelativeLayout relLayImageView = new RelativeLayout(context);
relLayImageView.setBackgroundResource(mImages[position]);
((ViewPager) container).addView(relLayImageView, new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
return relLayImageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((RelativeLayout) object);
object=null;
System.gc();
}
}
Trong một số thiết bị nó gây ra một ra khỏi bộ nhớ exceptionr một cách ngẫu nhiên khi dòng mã này được gọi là
relLayImageView.setBackgroundResource(mImages[position]);
Nhưng trong tất cả các thiết bị tôi nhìn thấy một cái gì đó như thế này trong logcat khi tôi lật các trang:
12-31 00:25:31.655: I/dalvikvm-heap(9767): Grow heap (frag case) to 50.875MB for 10384016-byte allocation
Ứng dụng này cũng treo trong một số thiết bị cho cùng một vấn đề khi hoạt động khác tôi đặt tài nguyên nền khác nhau vào bố cục chính dựa trên hành động của người dùng. Ở đây mã:
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
colorButtons.get(indiceColoreAttuale).setBackgroundResource(
unSelectedColorsRes[indiceColoreAttuale]);
switch (index) {
case 0:
mainLayout.setBackgroundResource(R.drawable.blus);
break;
case 1:
mainLayout
.setBackgroundResource(R.drawable.azzurros);
break;
case 2:
mainLayout
.setBackgroundResource(R.drawable.rossos);
break;
case 3:
mainLayout
.setBackgroundResource(R.drawable.giallos);
break;
case 4:
mainLayout
.setBackgroundResource(R.drawable.verdes);
break;
case 5:
mainLayout
.setBackgroundResource(R.drawable.rosas);
break;
case 6:
mainLayout
.setBackgroundResource(R.drawable.grigios);
break;
case 7:
mainLayout
.setBackgroundResource(R.drawable.neros);
break;
case 8:
mainLayout
.setBackgroundResource(R.drawable.arancios);
break;
case 9:
mainLayout
.setBackgroundResource(R.drawable.marrones);
break;
case 10:
mainLayout
.setBackgroundResource(R.drawable.violas);
break;
}
mainLayout.startAnimation(animationShowTextColor);
mainLayout.setGravity(Gravity.CENTER_HORIZONTAL);
indiceColoreAttuale = index;
colorButtons.get(index).setBackgroundResource(
selectedColorsRes[index]);
}
});
Chạy lại excepiton khi tôi gọi setBackgroundResource() trên mainLayout.
Tôi hy vọng bạn có thể giúp tôi giải quyết vấn đề này, cảm ơn trước!
Có vẻ như bạn đang tải một số hình nền _huge_ và thiết bị không có đủ bộ nhớ cho chúng ... –
Có, nhưng đôi khi xảy ra trên các thiết bị có nhiều bộ nhớ và không xảy ra trong các thiết bị có ít bộ nhớ hơn. tải hình ảnh không thực sự lớn (từ 50 đến 200 kb). – TheModularMind
Chúng không có âm thanh _huge_. Bạn có thể thử 'tái chế các bitmap chính mình trước khi thay đổi tài nguyên nền. Lấy background cũ drawable và sau khi thay đổi nó sẽ thấy nếu nó là một 'BitmapDrawable', nếu nó được gọi là' recycle() 'trên' Bitmap' của nó. –