Tad*_*das 0 android android-architecture-components
我实现了扩展ItemKeyedDataSource并提供来自会议室数据库的数据访问对象(DAO)的分页数据的类。我的DAO的查询方法将数据对象列表(不被包裹LiveData)传递给DataSource回调。
DataSource在包装的数据库表中发生更改后,例如,如果更改来自后台服务,则建议的无效方法是什么?如何在DataSource.Factory<Integer, T>DAO可以生成的返回参数中实现自动数据无效?
自动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;
}
}
Run Code Online (Sandbox Code Playgroud)
我在我的内部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;
}
}
Run Code Online (Sandbox Code Playgroud)
当DataSourceTableObserverinvalidate时DataSource,它的Factory内部类创建DataSource具有最新数据的新实例。
| 归档时间: |
|
| 查看次数: |
1757 次 |
| 最近记录: |