You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:03:01