Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试调用虚拟方法';在空对象引用上作废android.arch.lifecycle.LiveData.observe_Android_Android Fragments - Fatal编程技术网

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

尝试调用虚拟方法';在空对象引用上作废android.arch.lifecycle.LiveData.observe,android,android-fragments,Android,Android Fragments,我得到以下错误 Im使用Android架构组件,并尝试实例化viewmodel和观察LiveData中的数据。但是我被困在这里请帮我解决这个问题: Attempt to invoke virtual method 'void android.arch.lifecycle.LiveData.observe(android.arch.lifecycle.LifecycleOwner, android.arch.lifecycle.Observer)' on a null object referen

我得到以下错误

Im使用Android架构组件,并尝试实例化viewmodel和观察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()方法时,im获取和NullPoint异常错误

    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公司VIEWMODEL;
@凌驾
ActivityCreated上的公共无效(@Nullable Bundle savedinStateCState){
super.onActivityCreated(savedInstanceState);
companyViewModel=ViewModelProviders.of(this.get)(companyViewModel.class);
companyViewModel.initData();
companyViewModel.getCompany().observe(这个,新的观察者(){
@凌驾
更改后的公共无效(@Nullable CompanyEntity CompanyEntity){
}
});
}
@凌驾
创建视图上的公共视图(更平坦的充气机,
@可为空的视图组容器,@Nullable Bundle savedInstanceState){
返回充气机。充气(R.layout.fragment_company,容器,假);
}
}
我的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扩展了ViewModel{
私有LiveData公司实体LiveData;
私人公司储蓄公司;
上市公司视图模型(){}
上市公司视图模型(公司报告公司报告){
this.companyRepo=companyRepo;
}
public void initData(){
companyEntityLiveData=companyRepo.getCompany();
}
公共LiveData getCompany(){
返回companyEntityLiveData;
}
}
错误位于此行:

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

        }
    });
companyViewModel.getCompany().observe(这是新的观察者(){
@凌驾
更改后的公共无效(@Nullable CompanyEntity CompanyEntity){
}
});

这是我的公司报告课:

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;
    }
公共类公司存储库{
私有网络服务;
上市公司报告{
}
公共LiveData getCompany(){
最终的MutableLiveData数据=新的MutableLiveData();
webService.getCompany().enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
data.setValue(response.body());
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
});
返回数据;
}

}

在getCompany方法中,您需要检查companyEntityLiveData对象是否为空,如果为空,则调用其中的服务

public LiveData<CompanyEntity> getCompany() {
    if(companyEntityLiveData == null){
       companyEntityLiveData = companyRepo.getCompany();
    }
    return companyEntityLiveData;
}
public-LiveData-getCompany(){
if(companyEntityLiveData==null){
companyEntityLiveData=companyRepo.getCompany();
}
返回companyEntityLiveData;
}

必须观察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;
}
final MutableLiveData data=new MutableLiveData();
公共LiveData getCompany(){
webService.getCompany().enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
data.postValue(response.body());
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
});
返回数据;
}
更改

public CompanyViewModel(){
    companyRepo= new companyRepo();
}

public LiveData<CompanyEntity> getCompany() {
    if(companyEntityLiveData==null)
        companyEntityLiveData= companyRepo.getSection();
    return companyEntityLiveData;
}
public CompanyViewModel(){
companyRepo=新companyRepo();
}
公共LiveData getCompany(){
if(companyEntityLiveData==null)
companyEntityLiveData=companyRepo.getSection();
返回companyEntityLiveData;
}
在你的片段中:

    CompanyViewModel companyViewModel= 
    ViewModelProviders.of(this).get(CompanyViewModel .class);
    LiveData<CompanyEntity> s = companyViewModel.getCompany();

    s.observe(this, new Observer<CompanyEntity>() {
        @Override
        public void onChanged(@Nullable CompanyEntity companyEntity) {
            Toast.makeText(getContext(),"Go go go", Toast.LENGTH_LONG).show();
        }
    });
CompanyViewModel CompanyViewModel=
ViewModelProviders.of(this.get)(CompanyViewModel.class);
LiveData s=companyView.getCompany();
s、 观察(这个,新的观察者){
@凌驾
更改后的公共无效(@Nullable CompanyEntity CompanyEntity){
Toast.makeText(getContext(),“Go”,Toast.LENGTH_LONG.show();
}
});

问题是您试图使用尚未初始化的内容因此,为了不依赖于执行顺序,我们必须在存储存储库返回的内容的变量中建立一个安全的numability
private val nullableObj:LiveData?

这样,我们甚至可以在存储库加载属性之前使用它。检查以下示例中的执行顺序:

val aUse: LiveData<T> = MediatorLiveData<T>().apply {
    nullableObj?.let {
    }
}
private val nullableObj: LiveData<T2>? = repository::getNullableObj

GL

companyRepo.getCompany()
显然返回
null
。这是我的CompanyRepository类,它使用改装进行REST调用并返回大部分公司数据。如何修复它!!您能帮帮我吗?“您能帮帮我吗?”--我们没有
companyRepo.getCompany()
的代码,因此不知道它为什么会返回
null
。您可能希望编辑您的问题,并将代码发布到
CompanyRepository
。编辑后的问题请立即检查。请在您的答案中添加一些上下文,以便更好地帮助未来的访问者解决他们的问题。
companyVM.company?.observe(...) { ... }