感谢评论中的@pskink,这是我的解决方案:
public class DbLiveData<T>
extends MutableLiveData<T> {
public interface DataLoader<T> {
T loadData();
}
@NonNull
private final InvalidationTracker.Observer mDatabaseObserver;
@NonNull
private DataLoader<T> mDataLoader;
@NonNull
private final Executor mExecutor;
public DbLiveData(@NonNull String[] tables, @NonNull Executor executor, @NonNull DataLoader<T> dataLoader) {
mExecutor = executor;
mDataLoader = dataLoader;
mDatabaseObserver = new InvalidationTracker.Observer(tables) {
@Override
public void onInvalidated(@NonNull Set<String> tables) {
loadData();
}
};
loadData();
}
@Override
protected void onActive() {
super.onActive();
DB.get() // I get my DB from a Service Locator
.getInvalidationTracker()
.addObserver(mDatabaseObserver);
}
@Override
protected void onInactive() {
super.onInactive();
DB.get() // I get my DB from a Service Locator
.getInvalidationTracker()
.removeObserver(mDatabaseObserver);
}
private void loadData() {
mExecutor.execute(
() -> postValue(mDataLoader.loadData())
);
}
}
我创建了一个 LiveData 来管理一个InvalidationTracker.Observer
. 您只需将一个传递DataLoader
给构造函数,这个必须Cursor
从数据库中获取。
像这样 :
new DbLiveData<Cursor>(
new String[] { "foo" },
getExecutor(), // Provide an Executor
() -> DB.get() // I get my DB from a Service Locator
.fooDao()
.getFoo()
)