Attempt to invoke virtual method 'void android.arch.lifecycle.LiveData.observe on a null object reference

Pra*_*ool 6 android android-fragments

Im getting the following error

Im using Android architecture components and tried to instantiate viewmodel and Observe data from LiveData. But im stuck here please help me solve this issue :

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

My Fragment is this : While calling getCompany() method im getting and 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

My ViewModel class is this :

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Error is at this line :

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

        }
    });
Run Code Online (Sandbox Code Playgroud)

This is my CompanyRepository class:

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;
    }
Run Code Online (Sandbox Code Playgroud)

}

bra*_*tky 8

您必须观察 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;
}
Run Code Online (Sandbox Code Playgroud)