- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经开发了 20 多个 Android 应用程序,应用程序有一个由大图像幻灯片(例如 4 张尺寸为 750 x 1334 的图像)组成的教程 Activity ,并将在首次启动时向用户显示。
由于图像质量的原因,我无法再减小尺寸。
我的代码 fragment 如下;
public class GalleryImageActivity extends BaseActivity implements OnGestureListener, OnTouchListener {
ViewPager imagePager;
GalleryImageAdapter galleryImageAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gallery_image);
imagePager = (ViewPager) findViewById(R.id.image_pager);
galleryImageAdapter = new GalleryImageAdapter(this);
imagePager.setAdapter(galleryImageAdapter);
imagePager.setOnTouchListener(this);
}
}
public class GalleryImageAdapter extends PagerAdapter {
public static int SCREEN_CNT = 4;
Bitmap[] bmp = new Bitmap[SCREEN_CNT];
@Override
public int getCount() {
return SCREEN_CNT;
}
@Override
public Object instantiateItem(ViewGroup view, int position) {
View view = inflater.inflate(R.layout.gallery_image_item, null);
ImageView imv = (ImageView) view.findViewById(R.id.imgView);
bmp[position] = readBitMap(context, R.drawable.tutorial_img_0 + position, position);
if (bmp[position] != null)
imv.setImageBitmap(bmp[position]);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (bmp[position] != null && !bmp[position].isRecycled())
{
bmp[position].recycle();
System.gc();
bmp[position] = null;
}
}
public Bitmap readBitMap(Context context, int resId, int position) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
InputStream is = context.getResources().openRawResource(resId);
BitmapFactory.decodeStream(is,null, opt);
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
opt.inJustDecodeBounds = false;
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
is = context.getResources().openRawResource(resId);
Bitmap bitmap = BitmapFactory.decodeStream(is,null, opt);
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
}
有时效果很好,但是当重复5~6次时,BitmapFactory.decodeStream会抛出“内存不足”。我如何决定比例大小或解决此问题?
最佳答案
您可以修改readBitMap
函数如下;
public Bitmap readBitMap(Context context, int resId, int position){
if (bmp[position] == null || bmp[position].isRecycled())
{
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
opt.inScaled = true;
opt.inDensity = DisplayMetrics.DENSITY_DEFAULT; // !important
InputStream is = context.getResources().openRawResource(resId);
try {
bmp[position] = BitmapFactory.decodeStream(is,null,opt);
} catch (Exception e){
bmp[position] = null;
}
}
return bmp[position];
}
某些类型的手机,尤其是三星手机,对于内存泄漏的设计并不完善。
opt.inDensity = DisplayMetrics.DENSITY_DEFAULT
非常重要。
如果inDensity
为0
,则BitmapFactory.decodeStream
将填充与资源关联的密度。 more...
当您的 Activity(或页面)被销毁时,您应该将 imageview 的位图设置为 null
。
关于android - 如何避免从android资源加载大图片时出现OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52195458/
我有两种尺寸的图像(垂直和水平),它们将始终具有相同的尺寸,恭敬。我正在尝试创建一个容器来容纳图像但不会将内容推到上面并保持相似的高度或宽度。我也不想显示完整尺寸的图像,所以我在考虑使用 overfl
我有一个使用该类的 LaTeX 文档 \documentclass[12pt,a4paper]{scrbook} 我更改了一些用于定位浮点数的参数: \renewcommand{\topfractio
我有一个问题想和你分享。 所以就在这里。想象一下,我有一个非常大的图像,当我打开我的页面时它需要很重的负载。如果我想要将图像剪切成许多小块并在加载图像时将它们一个接一个地合并(只是 javascrip
我正在学习 Java SE 6.0。 是否有一张大图或图表来说明 Java 6.0 的所有类以及它们之间的关系? 提前致谢。 尊敬的 stackoverflow 开发人员和程序员。 你好。非常感谢您对
我得到了一个 InflateException 并且抛出了一个 OutOfMemoryError 异常。我知道我应该能够通过减小图像的大小/分辨率,或者通过将 android:largeHeap="t
我必须引用 id 从服务器到 android 移动设备检索所有大小的图像,所以我尝试使用下面的编码并成功获得 base 64 字符串并检索等效 base64string 的图像它适用于小尺寸图像但当我
我是一名优秀的程序员,十分优秀!