在android开发过程中,可能会遇到选择图片后应用程序崩溃的情况。这种情况可能会使开发者非常困惑并且浪费很多时间。但是,如果你了解这种崩溃的原因,你就可以快速的解决它。本文将详细介绍为什么会出现选择图片后应用程序崩溃的情况。
在android中,选择图片是一个很常见的操作,通常我们使用intent.action_pick或intent.action_get_content等操作对图片进行选择。然后,我们会在activity的onactivityresult()方法中获得相关的数据并绑定到ui元素中。这个过程中,很多开发者会遇到或者犯一个错误,就是在选择图片时可能会选择比较大的图片,并且在显示这些图片时只是简单地将它们缩小到imageview中,但这并不是正确的方式。因为在将图片加载到imageview时,这个过程是非常耗费资源的,特别是对于较大的图片。在某些情况下,这个过程可能会导致应用程序崩溃。
所以,我们需要注意的是,在加载大图片时,我们应该使用java中的bitmapfactory类,通过压缩图片来减少内存消耗。我们可以调用bitmap的静态方法decodefile(),decoderesource()或者decodestream()来获取bitmap对象,通过设置缩放选项options.insamplesize来对图片进行压缩。insamplesize的值是一个整数值,用于指定一个子样本大小。如果insamplesize的值为1,那么我们就获取整个图片。而如果insamplesize的值为2,那么我们就获取一半的图片,以此类推。
bitmapfactory.options options=new bitmapfactory.options();
//设置为true获取原始图片(不加载到内存),false则不同这些必要的信息
options.injustdecodebounds = true;
bitmapfactory.decodefile(filepath, options);
//计算图片取样率
options.insamplesize = calculateinsamplesize(options, reqwidth, reqheight);
//设置位图选项,表示需要加载原始图片到内存中
options.injustdecodebounds = false;
//重新加载图片
bitmap bitmap= bitmapfactory.decodefile(filepath,options);
calculateinsamplesize()是一个计算取样率的方法,它的实现方法如下:
private int calculateinsamplesize(bitmapfactory.options options, int reqwidth, int reqheight) {
final int height = options.outheight;
final int width = options.outwidth;
int insamplesize = 1;
//计算压缩比例,如果长宽都大于所需的长度和宽度,则进行压缩操作
if (height > reqheight || width > reqwidth)
{
final int heightratio = math.round((float) height / (float) reqheight);
final int widthratio = math.round((float) width / (float) reqwidth);
//选择长宽压缩比例中较大的一个进行压缩
insamplesize = heightratio < widthratio ? heightratio : widthratio;
}
return insamplesize;
}
此外,在显示大型图片时,最好使用多线程或异步加载将图片显示到imageview中。
总之,在android开发中选择图片时,需要注意加载大图片的内存消耗问题,如果不加注意可能会导致应用程序崩溃。所以使用在加载大图片时使用bitmapfactory类和多线程或异步加载的技术是非常必要的,对于避免应用程序崩溃有很大的帮助。