Android Studio使用ROOM数据库查询少一个对象且RecyclerView更新滞后
问题根源
你的代码出现操作滞后问题是执行顺序错误导致的:addEvent()方法中,数据库插入操作是通过Handler.post()放到主线程消息队列末尾排队执行的,而你调用完addEvent()后立刻执行了refreshEvents()查询数据库,此时插入操作还未执行,查询到的是插入前的旧数据。等下一次操作触发刷新时,上一次的插入已经完成,才会显示之前新增的内容,删除操作同理也是执行顺序的问题。
修复方案
方案1:调整执行顺序(快速适配现有代码)
把刷新列表的逻辑放到插入操作执行完成之后,修改addEvent()方法即可:
private void addEvent() { String eventTitle, eventInfo, eventDeadline; eventTitle = etTitleNewEvent.getText().toString(); eventInfo = etInfoNewEvent.getText().toString(); eventDeadline = etDeadlineNewEvent.getText().toString(); //创建事件对象 Event event = new Event(eventTitle, eventInfo, eventDeadline); Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { eventsDao.createEvent(event); Toast.makeText(Dashboard.this, "事件创建成功", Toast.LENGTH_SHORT).show(); // 插入完成后再刷新列表,保证查询到最新数据 refreshEvents(); } }; handler.post(runnable); }
同时删除点击确认按钮时重复的refreshEvents()调用:
btnOKNewEvent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { addEvent(); alertDialog.dismiss(); } });
方案2:规范ROOM异步操作(推荐用于正式项目)
你当前是在主线程执行数据库操作,需要在ROOM数据库配置中开启allowMainThreadQueries才不会崩溃,正式项目不推荐这么做,建议使用更规范的实现:
- 把DAO的查询方法返回值改为
LiveData<List<Event>>,ROOM会自动在子线程执行查询,数据变化时自动通知观察者,你只需要在onCreate中观察一次LiveData,自动更新RecyclerView即可,不需要手动调用refreshEvents。 - 插入、删除操作放到子线程执行,可以用协程、AsyncTask或者RxJava实现。
内容的提问来源于stack exchange,提问作者Ankit Kumar Maurya
相关产品推荐
相关产品推荐

