对于android应用程序的常见异常,android开发人员要从两个方面去了解。一是要知道有哪些常见的 android应用程序异常,二是需要知道哪些原因可能会造成这个异常。这不仅需要程序管理人员在日常工作中要注意积累,在必要的情况下还需要去从其它渠道收集资料

错误一:intent传递图片时常见报错

安卓一些错误的总结_第1张图片

上面这个报错是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。// 图片允许最大空间 单位:KBdouble 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();// 将字节换成KBdouble 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 栈溢出问题

安卓一些错误的总结_第2张图片

原因: 运行一个程序,JVM会开辟一块内存空间去储存程序进行时的某些信息,当程序运行时需要储存的信息超过了分配的空间,就会出现那样的问题.比如死循环就是view的层级溢出,每一层都代表一个栈层,Android最多只允许15还是14层嵌套的栈,所以在代码开发过程中布局尽量还是不要太复杂,最好不要嵌套太多

解决:目前还没有较好的解决办法,只能从从程序代码优化方面着手,检查是否有死循环、递归等程序,如果有,修正、优化相关代码。

更多相关文章

  1. Android中9patch图片格式(xx.9.png)介绍与制作详解
  2. [Android] 触屏setOnTouchListener实现图片缩放、移动、绘制和添
  3. Android中自定义SeekBar的背景颜色,进度条颜色,以及滑块的图片
  4. Android本地缓存和远程图片获取的实现
  5. Java乔晓松-android中获取图片的缩略图(解决OutOfMemoryError)内
  6. android的EditText里文字和图片混合编辑与显示
  7. 关于Android Studio中点9图的编译错误问题
  8. Android 打开相册,选择一张图片并返回

随机推荐

  1. Android Notification RemoteViews
  2. 第三方QQ登录不回调 (Android)
  3. 关于ListView中假如Button,EditText无法响
  4. Android 驱动开发文章收录
  5. android 默认浏览器 无法下载,此手机不支
  6. 【30篇突击 android】源码统计 十三
  7. android ATD configeration
  8. android之屏幕适配之一理论知识
  9. android传感器总结
  10. 【Demo实例】Android FTP上传带进度条(优