如何在Android中对长时间配置变更进行测试?
我之前也踩过一模一样的坑——配置变更(比如屏幕旋转)后,之前启动的AsyncTask返回结果时,原Activity已经被系统销毁重建,直接导致应用崩溃。后来我折腾出一套稳定的解决方案,分享给你:
问题核心拆解
AsyncTask的问题本质是和Activity的生命周期绑定过紧:配置变更触发Activity销毁重建,但后台任务还握着原Activity的引用,等回调执行时,原实例早就不存在了,各种空指针、非法状态异常也就找上门了。
我的解决方案实现
我把所有后台任务从Activity里抽离出来,交给Application管理的IntentService来统一执行,同时通过注册机制让Activity能安全接收任务结果:
- Activity端操作:
- 在
onStart()或者onCreate()阶段,向Application注册自己作为任务结果接收器(可以先定义一个接口,比如TaskResultReceiver,里面包含接收结果的抽象方法) - 一定要在
onDestroy()里取消注册,不然很容易引发内存泄漏
- 在
- Application端管理:
- 维护一个接收器的存储容器(推荐用
WeakHashMap,既能管理实例,又能避免强引用导致的内存泄漏) - 所有后台任务都交给IntentService处理,IntentService是独立于Activity生命周期的组件,配置变更完全不会影响它的运行
- 当IntentService完成任务后,遍历当前已注册的接收器,把结果分发给对应的存活Activity
- 维护一个接收器的存储容器(推荐用
额外优化建议
- 给每个任务分配唯一ID,让Activity只接收自己发起的任务结果,避免不同页面之间的结果混乱
- 如果需要并行处理多个后台任务,IntentService的串行执行可能不够用,可以换成
JobIntentService或者自定义线程池配合Service来实现 - 注册接收器时,务必用弱引用持有Activity实例,就算忘记取消注册,也不会导致Activity无法被GC回收
内容的提问来源于stack exchange,提问作者Cruces
相关产品推荐
相关产品推荐

