是哈雷唉 2022-04-12 17:42 采纳率: 50%
浏览 209
已结题

如何解决尝试在空对象引用上调用虚方法'void android.arch.lifecycle.LiveData.observe?(语言-java)

我正在使用Android架构组件,并尝试从LiveData实例化viewmodel和Observe数据,然后出现这个问题

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

这是我的调用Observe的地方,也就是报错的地方

public class CrimeListFragment extends Fragment {

    private RecyclerView mRecyclerView;
    private CrimeAdapter mAdapter;
    private boolean  mSubtitleVisible;
    private LiveData<List<Crime>> mListLiveData;
    private CrimeViewModel mCrimeViewModel;
    //这里就只贴出了问题的区域

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_crime_list,container,false);
        mRecyclerView=view.findViewById(R.id.crime_recycle_ListView);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        mCrimeViewModel=new ViewModelProvider(this).get(CrimeViewModel.class);
        mListLiveData=mCrimeViewModel.getListLiveData();
        mListLiveData.observe(this.getViewLifecycleOwner(), new Observer<List<Crime>>() {
        //这里报错
            @Override
            public void onChanged(List<Crime> crimes) {
                mAdapter.setCrimes(crimes);
                updateUi();
            }
        });
        updateUi();
        return view;
    }
}

这里是我Repository类和Runnable

//这个是Repository类
public class CrimeRepository {

    private final CrimeDAO mCrimeDAO;

    public CrimeRepository(Context context){
        mCrimeDAO= CrimeDatabase.getCrimeDataBase(context).getCrimeDao();
    }

    public LiveData<List<Crime>> getCrimeListLive() {
        MyRunnable myRunnable=new MyRunnable("SelectAllCrimeLive");
        Executors.newCachedThreadPool().execute(myRunnable);
        return myRunnable.getListLiveData();
    }

   public List<Crime> selectListCrime(){
        MyRunnable myRunnable=new MyRunnable("SelectAllCrime");
        Executors.newCachedThreadPool().execute(myRunnable);
        return myRunnable.getCrimes();
    }

//这是我自定义实现接口Runnable的类,CrimeRepository 的私有类

 private class MyRunnable implements Runnable{

      private LiveData<List<Crime>> mListLiveData;
        @Override
        public void run() {
            mListLiveData=mCrimeDAO.selectAllCrimeLive();
  }
}

这是我的ViewModel

public class CrimeViewModel extends ViewModel {

    private final CrimeRepository       mCrimeRepository;
    public CrimeViewModel(@NonNull Application application){
        mCrimeRepository=new CrimeRepository(application);
    }
  public LiveData<List<Crime>> getListLiveData(){
        return mCrimeRepository.getCrimeListLive();
    }
}

这是截图:

img

  • 写回答

2条回答 默认 最新

  • I'm an Android Dev 2022-04-13 14:24
    关注

    在这里加一个日志,看有没有被调用到
    public CrimeViewModel(@NonNull Application application){
    mCrimeRepository=new CrimeRepository(application);
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月22日
  • 已采纳回答 4月14日
  • 创建了问题 4月12日

悬赏问题

  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥20 OPENVPN连接问题