我实现了扩展ItemKeyedDataSource的类,并提供来自房间数据库的数据访问对象(DAO)的分页数据。我的DAO的查询方法将数据对象列表(不包含在LiveData
中)传递给DataSource
回调。
在包装数据库表发生更改后,DataSource
无效的建议方法是什么,例如,如果更改来自后台服务?如何在DAOs可以生成的DataSource.Factory<Integer, T>
返回参数中实现自动数据失效?
自动DataSource
失效可以通过将InvalidationTracker.Observer
挂钩到InvalidationTracker
来实现。你可以从InvalidationTracker
获得getInvalidationTracker()实例。
我像这样实现了我的InvalidationTracker.Observer
:
public class DataSourceTableObserver extends InvalidationTracker.Observer {
private DataSource dataSource;
public DataSourceTableObserver(@NonNull String tableName) {
super(tableName);
}
@Override
public void onInvalidated(@NonNull Set<String> tables) {
if (dataSource != null) dataSource.invalidate();
}
public void setCurrentDataSource(DataSource source) {
dataSource = source;
}
}
我在我的内部DataSource.Factory
类中使用它,如下所示:
public static class Factory implements DataSource.Factory<TvProgram, TvProgram> {
private Context appContext;
private DataSourceTableObserver observer;
private InvalidationTracker tracker;
private int channelId;
public Factory(Context context, int channelId) {
appContext = context.getApplicationContext();
observer = new DataSourceTableObserver(AppDatabase.PROGRAMS_TABLE);
tracker = AppDatabase.getInstance(appContext).getInvalidationTracker();
tracker.addObserver(observer);
this.channelId = channelId;
}
@Override
public DataSource<TvProgram, TvProgram> create() {
EpgDataSource epgDataSource = new EpgDataSource(appContext, channelId);
observer.setCurrentDataSource(epgDataSource);
return epgDataSource;
}
public void cleanUp() {
tracker.removeObserver(observer);
observer = null;
}
}
当DataSourceTableObserver
使DataSource
无效时,它的Factory
内部类创建了具有最新数据的新DataSource
实例。