如何在订阅liveData后仅为新更新观察liveData

时间:2018-05-22 19:59:03

标签: android kotlin observer-pattern pagedlist android-livedata

使用PagedList,这里没有数据库,但是内存中的数据列表(称之为CachedDataList)可以由fetchMore()函数填充。

拥有PositionalDataSourceDataSource.FactoryPagedList.BoundaryCallback,这只是一个问题。

流量是PositionalDataSource的loadInitial()将在开始加载来自CachedDataList的数据时调用,然后调用loadRange()以继续从{{1}加载数据按页面大小。

CachedDataList的所有数据被分页时,CachedDataList将被调用(如果开头没有后备数据,则调用BoundaryCallback::onItemAtEndLoaded()),

在那里,它将开始要求fetchMore将更多数据附加到BoundaryCallback::onZeroItemsLoaded(),并且当新数据附加到它时,然后调用DataSource的CachedDataList以重新启动新的PagedList和DataSource对,并再次从PositionalDataSource的invalidate()开始。

完成
loadInitial()

这里,它观察observableCachedData的变化,如果有变化,那么

observableCachedData.observe(owner, refreshHandler!!) //??? TODO: how to only listen to newly posted data after //starting the observe? //DOC: 'If LiveData already has data set, it will be delivered to the observer.' // fetchMore val didFetch = dataRequester.fetchMore() //asyc call
onChanged()
将调用

,并在其中调用DataSource的invalidate()

但是class RefreshHandler(val observableCachedData: MutableLiveData<List<Data>>) : Observer<List<Data>> { override fun onChanged(datalist: List<Data>?) 的订阅会导致observableCachedData.observe()立即被调用(它按照DOC中的说明设计),这里不需要这种行为,因为我们希望在新数据被调用时调用处理程序附加到refreshHandler

即。 CachedDataList有30个数据,当fetchMore()时会有另外30个数据附加到它,变成60.但是这个CachedDataList被调用时数据仍然是30(附加还没有到来) )。

有没有办法订阅实时数据,但只有在订阅后才会收到更新通知?

onChange()

2 个答案:

答案 0 :(得分:0)

您可以使用SingleLiveEvent

SingleLiveEvent

答案 1 :(得分:0)

使其能够检查Using Observable.subscribe directly should work.like below @Injectable() export class HallService { public http:Http; public static PATH:string = 'app/backend/' constructor(http:Http) { this.http=http; } getHalls() { // ########### No map return this.http.get(HallService.PATH + 'hall.json'); } } export class HallListComponent implements OnInit { public halls:Hall[]; / *** / ngOnInit() { this._service.getHalls() .subscribe(halls => this.halls = halls.json()); // <<-- } } 中的已发布数据列表,只有在列表中添加了更多内容时才会失效。

(它应该寻找一种更好的方法来确定数据主义者真正增加了。)

RefreshHandler(val observableCachedData: MutableLiveData<List<Data>>)