使用ViewPager,处理图片时出现outOfmemomery错误
Using ViewPager, outOfmemomery error when dealing with images
我一直在使用 viewPager 加载图像:它可以完美地加载两张图像,但是当我增加图像数量时它崩溃了。
我已经压缩了图像尺寸,但这并没有解决问题。
根据 Whosebug 上的一些类似问题,我也使用了 Recycle 但这也没有解决问题
还有其他增加内存管理的方法吗?
谢谢
你有没有用样本量来衡量它们?尝试用它创建位图,这样它只会加载所需大小的位图,而不是将完整大小的位图加载到内存中。
public int calculateInSampleSize(BitmapFactory.Options options) {
DisplayMetrics displayMetrics = cxt.getResources().getDisplayMetrics();
int reqWidth = displayMetrics.widthPixels;
final int height = options.outHeight;
final int width = options.outWidth;
double devCal2 = (height*1000)/width;
int reqHeight = (int) ((devCal2/1000)*reqWidth);
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
public Bitmap createBitmap(){
BitmapFactory.Options options2 = new BitmapFactory.Options();
options2.inJustDecodeBounds = true;
options2.inDither=true;
BitmapFactory.decodeFile(cxt.getExternalFilesDir(filepath) +"/companylogo.png",options2);
options2.inSampleSize = calculateInSampleSize(options2);//=32
options2.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(cxt.getExternalFilesDir(filepath) +"/companylogo.png",options2);
}
参考请查看http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
我还了解到使用弱引用对图像来说是个好主意,也许这会有所帮助 http://eclipsesource.com/blogs/2012/07/31/loading-caching-and-displaying-images-in-android-part-1/
我一直在使用 viewPager 加载图像:它可以完美地加载两张图像,但是当我增加图像数量时它崩溃了。 我已经压缩了图像尺寸,但这并没有解决问题。 根据 Whosebug 上的一些类似问题,我也使用了 Recycle 但这也没有解决问题
还有其他增加内存管理的方法吗?
谢谢
你有没有用样本量来衡量它们?尝试用它创建位图,这样它只会加载所需大小的位图,而不是将完整大小的位图加载到内存中。
public int calculateInSampleSize(BitmapFactory.Options options) {
DisplayMetrics displayMetrics = cxt.getResources().getDisplayMetrics();
int reqWidth = displayMetrics.widthPixels;
final int height = options.outHeight;
final int width = options.outWidth;
double devCal2 = (height*1000)/width;
int reqHeight = (int) ((devCal2/1000)*reqWidth);
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
public Bitmap createBitmap(){
BitmapFactory.Options options2 = new BitmapFactory.Options();
options2.inJustDecodeBounds = true;
options2.inDither=true;
BitmapFactory.decodeFile(cxt.getExternalFilesDir(filepath) +"/companylogo.png",options2);
options2.inSampleSize = calculateInSampleSize(options2);//=32
options2.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(cxt.getExternalFilesDir(filepath) +"/companylogo.png",options2);
}
参考请查看http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
我还了解到使用弱引用对图像来说是个好主意,也许这会有所帮助 http://eclipsesource.com/blogs/2012/07/31/loading-caching-and-displaying-images-in-android-part-1/