对于android应用程序的常见异常,android开发人员要从两个方面去了解。一是要知道有哪些常见的 android应用程序异常,二是需要知道哪些原因可能会造成这个异常。这不仅需要程序管理人员在日常工作中要注意积累,在必要的情况下还需要去从其它渠道收集资料
错误一:intent传递图片时常见报错
上面这个报错是intent传递数据过大时的报错,出现这种报错通常一般是进行图片传递的时候经常会发现的错误,根据网上查询和实践得出,压缩数据,不过数据量也不能太大,目前我们的测试数据是8M字节左右。如果大于这个数据,需要通过其他手段传输,例如文件或者共享内存。
搜索之后看大家都说不能直接传递大于40k的图片,解法就是把bitmap存储为byte数组,然后再通过Intent传递。有工作经验的都知道bitmap已经实现了Parcelable接口
import android.graphics.Bitmap; import android.os.Parcel; import android.os.Parcelable; public class ParceBean implements Parcelable{ private Bitmap dw; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Bitmap getDw() { return dw; } public void setDw(Bitmap dw) { this.dw = dw; } public static final Parcelable.Creator<ParceBean> CREATOR = new Creator<ParceBean>() { public ParceBean createFromParcel(Parcel source) { ParceBean pb = new ParceBean(); pb.name = source.readString(); pb.dw = Bitmap.CREATOR.createFromParcel(source); return pb; } public ParceBean[] newArray(int size) { return new ParceBean[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(name); dw.writeToParcel(parcel, 0); } } Bitmap本身实现了Parcelable接口,利用writeToParccel之后可以用createFromParcel来rebuild这个Bitmap。
所以实际应用过程中intent.putExtra("bitmap", bitmap);
传输前我们就应该先压缩,所以我就写了一段代码》》》》》》》》》》》》》》
先写图片压缩的方法》》》》》》》》》》》》
/*** * 图片的缩放方法 * * @param bgimage * :源图片资源 * @param newWidth * :缩放后宽度 * @param newHeight * :缩放后高度 * @return */ public static Bitmap zoomImage(Bitmap bgimage, double newWidth, double newHeight) { // 获取这个图片的宽和高 float width = bgimage.getWidth(); float height = bgimage.getHeight(); // 创建操作图片用的matrix对象 Matrix matrix = new Matrix(); // 计算宽高缩放率 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 缩放图片动作 matrix.postScale(scaleWidth, scaleHeight); Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width, (int) height, matrix, true); return bitmap; }
然后把图片压缩为40k以内
if (bit != null) {
// Intent传输的bytes不能超过40k。 // 图片允许最大空间 单位:KB double maxSize = 40.00; // 将bitmap放至数组中,意在bitmap的大小(与实际读取的原文件要大) ByteArrayOutputStream baos = new ByteArrayOutputStream(); while (bit.getByteCount() >= maxSize * 1024) { bit.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] b = baos.toByteArray(); // 将字节换成KB double mid = b.length / 1024; // 判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩 if (mid > maxSize) { // 获取bitmap大小 是允许最大大小的多少倍 double i = mid / maxSize; // 开始压缩 此处用到平方根 将宽带和高度压缩掉对应的平方根倍 // (1.保持刻度和高度和原bitmap比率一致,压缩后也达到了最大大小占用空间的大小) bit = zoomImage(bit, bit.getWidth() / Math.sqrt(i), bit.getHeight() / Math.sqrt(i)); } }
这个方法就保证了传输的图片永远不会大于40k。
错误二:就是context的运用
在使用popwindow和dialog的时候这是最常见的错误,常见的是使用getApplicationContext()来代替this或者XXXActivity.this。因为new对话框的时候,参数content 指定成了this,即指向当前子Activity的content。但子Activity是动态创建的,不能保证一直存在。其父Activity的content是稳定存在的,所以有下面的解决办法。
解决办法:
在实例化的过程里最好不要写在onCreat()里面,因为dialog和popwindow会伴随activity的销毁而消失,当activity销毁里再次进入就会出现尚需错误,将content替换为getParent(),XXXActivity.this即可,若还不可以的话只能另外查看原因了。
错误三:classcastexception,即类型转换异常
解决办法:请根据log,检查错误行号以及对应的xml,这种错误特别是在自定义控件时很容易出现,所以说代码编写要细心
错误四:StackOverflowError 栈溢出问题
原因: 运行一个程序,JVM会开辟一块内存空间去储存程序进行时的某些信息,当程序运行时需要储存的信息超过了分配的空间,就会出现那样的问题.比如死循环就是view的层级溢出,每一层都代表一个栈层,Android最多只允许15还是14层嵌套的栈,所以在代码开发过程中布局尽量还是不要太复杂,最好不要嵌套太多
解决:目前还没有较好的解决办法,只能从从程序代码优化方面着手,检查是否有死循环、递归等程序,如果有,修正、优化相关代码。