安卓一些错误的总结

对于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。
					// 图片允许最大空间 单位: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 栈溢出问题

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

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

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

 

 

你可能感兴趣的:(android,异常,经验)