尝试在空对象引用上调用虚方法 'void android.arch.lifecycle.LiveData.observe

新手上路,请多包涵

我收到以下错误

我正在使用 Android 架构组件并尝试实例化视图模型并观察来自 LiveData 的数据。但我被困在这里请帮我解决这个问题:

 Attempt to invoke virtual method 'void android.arch.lifecycle.LiveData.observe(android.arch.lifecycle.LifecycleOwner, android.arch.lifecycle.Observer)' on a null object reference

我的片段是这样的:在调用 getCompany() 方法时我得到了 NullPoint Exception Error

     public class CompanyFragment extends LifecycleFragment {
    private CompanyViewModel companyViewModel;

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        companyViewModel = ViewModelProviders.of(this).get(CompanyViewModel.class);
        companyViewModel.initData();
        companyViewModel.getCompany().observe(this, new Observer<CompanyEntity>() {
            @Override
            public void onChanged(@Nullable CompanyEntity companyEntity) {

            }
        });
    }
    @Override
    public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_company, container, false);
    }
}

我的 ViewModel 类是这样的:

 public class CompanyViewModel extends ViewModel {
    private LiveData<CompanyEntity> companyEntityLiveData;
    private CompanyRepository companyRepo;

    public CompanyViewModel() {}

    public CompanyViewModel(CompanyRepository companyRepo){
        this.companyRepo = companyRepo;
    }

    public void initData(){
        companyEntityLiveData = companyRepo.getCompany();
    }

    public LiveData<CompanyEntity> getCompany() {
        return companyEntityLiveData;
    }

}

错误在这一行:

    companyViewModel.getCompany().observe(this, new Observer<CompanyEntity>() {
        @Override
        public void onChanged(@Nullable CompanyEntity companyEntity) {

        }
    });

这是我的 CompanyRepository 类:

 public class CompanyRepository {
private WebService webService;

    public CompanyRepository(){

    }

    public LiveData<CompanyEntity> getCompany() {
        final MutableLiveData<CompanyEntity> data = new MutableLiveData<>();

        webService.getCompany().enqueue(new Callback<CompanyEntity>() {
            @Override
            public void onResponse(Call<CompanyEntity> call, Response<CompanyEntity> response) {
                data.setValue(response.body());
            }

            @Override
            public void onFailure(Call<CompanyEntity> call, Throwable t) {

            }
        });

        return data;
    }
}

原文由 Praveen Cool 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 275
2 个回答

您必须观察 LiveData 的相同实例。在您的 CompanyRepository 类中,您每次访问公司时都会创建一个新的 LiveData 实例,这意味着您的活动随后会观察一个旧实例。

getCompany 方法应该更改为始终返回相同的 LiveData 实例。此外,您应该将 setValue() 更改为 postValue(),因为您正在尝试更新后台线程上的值。

 final MutableLiveData<CompanyEntity> data = new MutableLiveData<>();
public LiveData<CompanyEntity> getCompany() {

    webService.getCompany().enqueue(new Callback<CompanyEntity>() {
        @Override
        public void onResponse(Call<CompanyEntity> call, Response<CompanyEntity> response) {
            data.postValue(response.body());
        }

        @Override
        public void onFailure(Call<CompanyEntity> call, Throwable t) {

        }
    });

    return data;
}

原文由 bradkratky 发布,翻译遵循 CC BY-SA 3.0 许可协议

也许您可以在该方法之后声明一个 LiveData 对象。

我的情况就是这样。

 fun aMethod() {
    _aLiveData.value = Unit
}

private val _aLiveData = MutableLiveData<Unit>()
val aLiveData: LiveData<Unit> = _aLiveData

其实应该是这样的。

 private val _aLiveData = MutableLiveData<Unit>()
val aLiveData: LiveData<Unit> = _aLiveData

fun aMethod() {
    _aLiveData.value = Unit
}

原文由 Davronbek Nabiyev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题