Android Room Dao insert返回Runnable报错,如何配合Executor异步执行?
问题原因
Room框架的@Insert、@Update、@Delete注解仅支持方法返回void、Long/Int类型(对应受影响的行数、插入的主键ID),不支持自定义返回Runnable类型,所以会触发编译报错。Executor.execute()需要接收的Runnable实例不需要由Dao层返回,你只需要手动把数据库操作逻辑封装到Runnable中传给Executor即可,完全可以保留你原来的异步执行逻辑。
修复步骤
1. 修改TripDao层代码
将增删改方法的返回值从Runnable改为void即可:
@Dao public interface TripDao { @Query("DELETE FROM trip") public void deleteTrips(); @Query("SELECT * FROM trip") LiveData<List<Trip>> getAll(); @Query("SELECT * FROM trip WHERE uuid=:id") public LiveData<Trip> getTrip(UUID id); // 把返回值从Runnable改为void @Delete void delete(Trip trip); @Insert void insertTrip(Trip trip); @Update void updateTrip(Trip trip); }
2. 修改TripRepository层代码
把所有数据库写操作封装到Runnable中再传给Executor执行,同时注意原来的deleteTrips方法没有走异步,也需要一起调整:
// 其他代码保持不变,仅修改以下几个方法 void deleteTrips(){ // 封装为Runnable传给Executor executor.execute(() -> tripDao.deleteTrips()); } void delete(Trip trip){ executor.execute(() -> tripDao.delete(trip)); } void insertTrip(Trip trip){ executor.execute(() -> tripDao.insertTrip(trip)); } void updateTrip(Trip trip){ executor.execute(() -> tripDao.updateTrip(trip)); }
修改完成后重新编译即可解决报错,原有Executor异步执行的逻辑完全保留。
内容的提问来源于stack exchange,提问作者thaway777
相关产品推荐
相关产品推荐

