android bug分析总结,Android常见Bug原因分析及处理

1.通知栏的图标显示小方块

原因:Android5.0以后不允许通知展示RGB图,不是透明的部分都会被显示为纯色(Notification.smallIcon属性设置的图片)

国内Android厂商修改底层使其可以显示彩色图

MIUI可以设置显示原生或者MIUI通知

解决方案:使用彩色的透明图片进行兼容(或者可以直接不管,这个问题只会出现在手动切换了MIUI通知样式或者使用原生手机的情况下)

2.java.util.ConcurrentModificationException

原因:在okHttp的拦截器中使用成员变量HashMap引起的线程同步问题,或者在另一个线程中改变了此时该线程正在遍历的集合

解决方案:使用HashTable代替,在synchronized块中进行遍历

总结:所有线程不安全的集合都可能出现这个问题,或者在迭代器中删除item也会出现(使用迭代器中的删除方法解决),多线程也可能出现

3.使用decorView的宽度作为屏幕宽

DecorView其实是PhoneWindow中的一个内部类,本质上也是一个View,其只是扩展了FrameLayout的实现,其中包含了状态栏、标题栏以及contentView

理论上来说其宽度应该等于屏幕宽度(这是一种不被推荐的偷懒做法),但是在oppo R17上其比屏幕宽度小了很多

原因:未知

解决方案:使用windowManager获取屏幕宽度

4.mp4Parser剪辑视频失败

mp4Parser是一个轻量级的视频编辑库,在剪辑时依靠视频关键帧进行剪辑

而如果视频关键帧丢失则会导致无法剪辑

使用ffmpeg直接进行剪辑时也无法正常剪辑,需要额外生成关键帧

缺点:生成关键帧比较耗时,比以前慢了数倍,且ffmpeg包的体积较大

5.android.view.WindowManager$BadTokenException

该异常一般是Dialog等所依附的上下文不存在了,多发生在调用接口后数据返回前退出某个页面,然后数据返回后使用到了已销毁的上下文导致

解决方案:在使用context前进行有效性判断,(在ViewModel使用Rxjava的机制及时销毁掉了不再使用的数据请求(实际上是将回调与请求断开),不用单独处理)

6.Input dispatching timed out(ANR)

可能耗时的操作都尽量放到子线程去,以免阻塞主线程,比如相册的排序

7.意料之外的数据混乱

RecyclerView在组件复用时addlistener会越加越多导致数据混乱或者崩溃

在可加载更多类型的Dialog的数据如果保存在Context中,需要注意Dialog数据的复原,以免使用旧的数据导致问题

8.Handler可能造成的空指针崩溃

使用Handler做延时操作或者耗时操作时,注意进行切回主线程时的Context状态判断

9.Fragment和Activity中常见的空指针错误(由于代码不规范)

在创建Fragment时使用了直接赋值的方式提供参数,正常情况下没有问题,但在Fragment意外销毁重建(比如横竖屏切换,暗黑模式切换)时这些参数会丢失造成空指针错误

解决方案:1.创建时使用Bundle进行参数的添加,在Fragment中再取出,这样数据就不会丢失,Fragment会自动进行现场的保护

2.在生命周期方法onSaveInstanceState中手动保存数据,不过也只能保存Bundle支持的类型,取得时候也更麻烦一些(不推荐)

3.对于Activity可以设置configChanges:orientation切换横竖屏,configChanges:uiMode不重跑生命周期(不太推荐)

10.saveState相关类型转换错误

在同一个页面的不同组件中使用了相同的id,尤其是使用到自定义布局(include也有可能)时(因为这样AS不会检查到错误)

一般第一次创建不会出错(如果设置了configChanges:orientation切换横竖屏不出现),而在意外销毁(比如切换暗黑模式)会出现

原因:在页面意外销毁时会自动保存一些View的状态并在重建时恢复,而如果使用了相同的Id,就可能将其他组件的状态强行恢复到某个组件中,造成类型转换错误

解决方案:使用不同的Id

避免方案:使用阿里的Android代码规范命名Id:组件名_模块名_功能,如:tv_order_title

11.Android4.4的崩溃

1.OkHttp的版本太高,降低到3.12.x,如果使用了retrofit需要使用如下格式强制使用低版本okhttp

implementation ('com.squareup.okhttp3:okhttp:3.12.12'){

force =true

}

OkHttp works on Android 5.0+ (API level 21+) and on Java 8+.

The OkHttp 3.12.x branch supports Android 2.3+ (API level 9+) and Java 7+.

2.java.lang.ClassNotFoundException: Didn't find class "com.xx.xx" on path: DexPathList[ xxxx]

低版本分包错误

在Application中添加

override fun attachBaseContext(base: Context?) {

super.attachBaseContext(base)

MultiDex.install(this)

}

Gradle中添加

implementationgroup:'androidx.multidex',name:'multidex',version:'2.0.1' //使用support包的自行替换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值