安卓一些错误的总结
对于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。// 图片允许最大空间 单位: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 栈溢出问题
原因: 运行一个程序,JVM会开辟一块内存空间去储存程序进行时的某些信息,当程序运行时需要储存的信息超过了分配的空间,就会出现那样的问题.比如死循环就是view的层级溢出,每一层都代表一个栈层,Android最多只允许15还是14层嵌套的栈,所以在代码开发过程中布局尽量还是不要太复杂,最好不要嵌套太多
解决:目前还没有较好的解决办法,只能从从程序代码优化方面着手,检查是否有死循环、递归等程序,如果有,修正、优化相关代码。
更多相关文章
- Android中9patch图片格式(xx.9.png)介绍与制作详解
- [Android] 触屏setOnTouchListener实现图片缩放、移动、绘制和添
- Android中自定义SeekBar的背景颜色,进度条颜色,以及滑块的图片
- Android本地缓存和远程图片获取的实现
- Java乔晓松-android中获取图片的缩略图(解决OutOfMemoryError)内
- android的EditText里文字和图片混合编辑与显示
- 关于Android Studio中点9图的编译错误问题
- Android 打开相册,选择一张图片并返回