Android使用ViewModel+LiveData实现计时器时出现MutableLiveData空指针异常
崩溃原因
- 核心触发点为
MainViewModel中的liveData成员变量仅完成了类型声明,没有实例化,默认值为null。当MainActivity的onStart生命周期调用mViewModel.liveData.observe时,就会触发空指针异常。 - 额外隐患:即使跳过Activity侧的观察步骤,ViewModel构造器中先启动计时器,
CountDownTimer首次触发onTick调用liveData.postValue时也会触发空指针。
修复方案
第一步:修改MainViewModel逻辑,先初始化LiveData再启动计时器
同时建议封装LiveData访问权限,避免外部直接修改内部数据:
public class MainViewModel extends AndroidViewModel { private MutableLiveData<String> liveData; public MainViewModel(@NonNull Application application) { super(application); // 先完成LiveData实例化 liveData = new MutableLiveData<>(); // 初始化完成后再启动计时器 startTimer(); } // 对外暴露不可变的LiveData供页面观察 public LiveData<String> getTimeLiveData() { return liveData; } void startTimer(){ new CountDownTimer(20000,1000) { @Override public void onTick(long l) { liveData.postValue(String.valueOf(l/1000)); } @Override public void onFinish() { liveData.postValue("计时完成"); } }.start(); } }
第二步:修改MainActivity的观察逻辑
通过公开方法获取LiveData,避免直接访问ViewModel的成员变量:
@Override protected void onStart() { super.onStart(); mViewModel.getTimeLiveData().observe(this, new Observer<String>() { @Override public void onChanged(String s) { textView.setText(s); } }); }
可选优化
LiveData的observe方法自带生命周期感知能力,无需每次onStart都重复注册观察者,可以把观察逻辑移到onCreate中,避免重复注册的问题。
内容的提问来源于stack exchange,提问作者Monsieur DanKar
相关产品推荐
相关产品推荐

