Android WorkManager使用beginUniqueWork时触发空指针崩溃求助
兄弟,我看你在测试WorkManager的「确保唯一工作」功能时遇到了崩溃,报错是Attempt to invoke virtual method 'boolean androidx.work.State.isFinished()' on a null object reference,结合你贴的applyBlur()代码,我大概率能定位到问题所在。
问题根源
这个空指针报错几乎肯定是因为你在观察工作状态(WorkInfo)时没有做判空处理。当你使用ExistingWorkPolicy.REPLACE策略调用beginUniqueWork时,WorkManager会立即取消并替换掉之前同名的工作链。如果此时你正在通过getWorkInfosForUniqueWorkLiveData或者类似方法观察旧工作的状态,LiveData可能会返回空的WorkInfo列表,或者单个WorkInfo为null。这时候直接调用workInfo.getState().isFinished()就会触发空指针异常。
举个例子,如果你有类似这样的观察代码:
mWorkManager.getWorkInfosForUniqueWorkLiveData(IMAGE_MANIPULATION_WORK_NAME) .observe(getViewLifecycleOwner(), workInfos -> { // 这里没判空就直接取第一个元素 WorkInfo workInfo = workInfos.get(0); if (workInfo.getState().isFinished()) { // 处理完成逻辑 } });
当旧工作被替换后,workInfos可能为空,或者workInfo本身是null,直接调用方法就会崩溃。
解决方案
给WorkInfo观察代码加上完整判空
修改你的观察逻辑,确保在访问WorkInfo的状态前先检查是否为空:mWorkManager.getWorkInfosForUniqueWorkLiveData(IMAGE_MANIPULATION_WORK_NAME) .observe(getViewLifecycleOwner(), workInfos -> { // 先检查列表是否为空或null if (workInfos == null || workInfos.isEmpty()) { return; } WorkInfo workInfo = workInfos.get(0); // 再检查单个WorkInfo是否为null if (workInfo != null) { if (workInfo.getState().isFinished()) { // 你的完成处理逻辑 } } });确保WorkManager依赖版本最新
旧版本的WorkManager可能存在一些与REPLACE策略相关的bug,建议升级到最新稳定版。比如在你的build.gradle中更新依赖:implementation "androidx.work:work-runtime:2.8.1" // 替换为最新稳定版检查Worker内部的状态处理
虽然可能性较低,但如果你的Worker(比如CleanupWorker、BlurWorker)在onStopped()方法中处理状态时没有判空,也可能引发类似问题。确保在Worker中访问WorkInfo或State前都做了null检查。
验证方法
修改完观察代码的判空逻辑后,多次调用applyBlur()测试图片模糊功能,看看崩溃是否消失。如果还是有问题,可以检查一下createInputDataForUri()方法是否正确生成了输入数据,避免因为Uri为空导致后续Worker出现异常。
内容的提问来源于stack exchange,提问作者AmmY

