分页库 - 在BoundaryCallback调用后,DataSource没有使自身无效

时间:2018-01-29 10:50:01

标签: android paging android-room android-architecture-components

在给定的PagingWithNetworkSample中:

@Query("SELECT * FROM posts WHERE subreddit = :subreddit ORDER BY indexInResponse ASC")
fun postsBySubreddit(subreddit : String) : DataSource.Factory<Int, RedditPost>

这里他们使用LimitOffsetDataSource<T> extends TiledDataSource<T>作为提供者,

当特定表更新时,它将失效:

mObserver = new InvalidationTracker.Observer(tables) {
        @Override
        public void onInvalidated(@NonNull Set<String> tables) {
            invalidate();
        }
    };
db.getInvalidationTracker().addWeakObserver(mObserver);

但在我的情况下:

class StatusDataSource() : PageKeyedDataSource<String, Status>() {

// additional code, not my expected
init {
    db.invalidationTracker.addObserver(object : InvalidationTracker.Observer("statuses") {
        override fun onInvalidated(tables: MutableSet<String>) {
            invalidate()
        }
    })
}

override fun loadInitial(params: LoadInitialParams<String>, callback: LoadInitialCallback<String, Status>) {
    val data = dao.loadInitial(path, params.requestedLoadSize)
    if (data.isEmpty()) {
        callback.onResult(data, null, null)
    } else {
        callback.onResult(data, null, data.last().id)
    }
}

// additional code, not my expected  
override fun isInvalid(): Boolean {
    db.invalidationTracker.refreshVersionsAsync()
    return super.isInvalid()
    }
}

我已经创建了一个扩展PageKeyedDataSource的类,但事情没有达到预期效果:如果room中的数据用完,首先load()将返回EMPTY,然后将触发BoudaryCallback从服务器获取数据:

@MainThread
override fun onZeroItemsLoaded() {
    helper.runIfNotRunning(PagingRequestHelper.RequestType.INITIAL) {
        webservice.fetch_from_path(path = path, count = networkPageSize, id = uniqueId).enqueue(createWebserviceCallback(it))
    }
}
我将项目插入db后,

但是StatusDataSource并未使自己失效。

我需要添加上面的addtional代码,以观察“状态”表并使数据源无效吗?

但它似乎不是一种有效的方式......更糟糕的是,当加载数据时,recyclerView不能在其滚动位置(底部)中保持,而是滚动到某个位置。看起来,这种失效方法可以与pagedList('ー`)キラッ

一起正常工作

如果有人给我一个很受欢迎的工作实例,请提前(1¯∀¯)

0 个答案:

没有答案