【问题标题】:Attempt to invoke virtual method 'void android.arch.lifecycle.LiveData.observe on a null object reference尝试在空对象引用上调用虚拟方法 'void android.arch.lifecycle.LiveData.observe
【发布时间】:2021-01-27 20:33:35
【问题描述】:

我收到以下错误

我正在使用 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 异常错误

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

}

【问题讨论】:

  • companyRepo.getCompany() 显然返回null
  • 这是我的 CompanyRepository 类,它使用 Retrofit 进行 REST 调用并返回公司数据的 liost。
  • 如何修复它!你能帮帮我吗?
  • “你能帮帮我吗?” -- 我们没有companyRepo.getCompany() 的代码,因此不知道为什么它会返回null。您可能希望编辑您的问题并将代码发布到CompanyRepository
  • 已编辑问题,请立即查看。

标签: android android-fragments


【解决方案1】:

您必须观察 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;
}

【讨论】:

    【解决方案2】:

    改变

    public CompanyViewModel(){
        companyRepo= new companyRepo();
    }
    
    public LiveData<CompanyEntity> getCompany() {
        if(companyEntityLiveData==null)
            companyEntityLiveData= companyRepo.getSection();
        return 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();
            }
        });
    

    【讨论】:

    • 请在您的回答中添加一些上下文,以便更好地帮助未来的访问者解决这个问题,因为他们的问题可能略有不同。
    【解决方案3】:

    在getCompany方法中需要检查companyEntityLiveData对象是否为null,如果是则调用service。

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

    【讨论】:

      【解决方案4】:

      问题是您正在尝试使用尚未初始化的东西。 所以为了不依赖于执行顺序,我们必须在存储存储库返回内容的变量中建立一个安全的可空性 private val nullableObj: LiveData&lt;T2&gt;?

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

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

      在使用 Repository #getCompany() 之前回答您的问题,请检查可空性。在 Kotlin 中:

      companyVM.company?.observe(...) { ... }
      

      GL

      【讨论】:

        猜你喜欢
        • 2021-08-30
        • 2019-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-07
        • 2018-05-22
        相关资源
        最近更新 更多