如何使用 RxJava 2 改进从 Firebase db 读取的 Flowable<Object> 数据?
Posted
技术标签:
【中文标题】如何使用 RxJava 2 改进从 Firebase db 读取的 Flowable<Object> 数据?【英文标题】:How to improve Flowable<Object> data reading from Firebase db using RxJava 2? 【发布时间】:2017-07-17 05:16:18 【问题描述】:我有显示来自 Fire Base db 的数据的 Recycler Viewer,但是初始列表包含大约 4k 个元素。我试图只显示前 15 个元素,而不是等待加载完整列表,但不知道该怎么做。
我正在尝试通过订阅者获取 (x) 元素,但它并没有提高读取性能(它仍然等待来自 Firebase DB 的 4k 元素)。如何加快速度?
订阅者 - 演示者
@Override
public void onBindViewHolder(final ListContentFragment.ViewHolder holder, int position)
modelInterface.getDataFromFireBase("FinalSymbols")
.take(15)
.subscribeOn(Schedulers.newThread())
.observeOn(androidSchedulers.mainThread())
.subscribe(new Consumer<DataSnapshot>()
@Override
public void accept(DataSnapshot dataFromDb) throws Exception
//update TextView inside Recycler Viewer
holder.name.setText(dataFromDb.child(String.valueOf(holder.getAdapterPosition())).child("description").getValue().toString());
holder.description.setText(dataFromDb.child(String.valueOf(holder.getAdapterPosition())).child("categoryName").getValue().toString());
);
发布者 - 数据源 (FireBase db)
@Override
public Flowable<DataSnapshot> getDataFromFireBase(final String childName)
return Flowable.create(new FlowableOnSubscribe<DataSnapshot>()
@Override
public void subscribe(final FlowableEmitter<DataSnapshot> e) throws Exception
databaseReference.child(childName).addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
e.onNext(dataSnapshot);
e.onComplete();
@Override
public void onCancelled(DatabaseError databaseError)
);
, BackpressureStrategy.BUFFER);
【问题讨论】:
【参考方案1】:相信你需要使用limitToFirst()
的方法。
类似这样的:
@Override
public Flowable<DataSnapshot> getDataFromFireBase(final String childName)
return Flowable.create(new FlowableOnSubscribe<DataSnapshot>()
@Override
public void subscribe(final FlowableEmitter<DataSnapshot> e) throws Exception
databaseReference.child(childName).limitToFirst(15).addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
e.onNext(dataSnapshot);
e.onComplete();
@Override
public void onCancelled(DatabaseError databaseError)
);
, BackpressureStrategy.BUFFER);
【讨论】:
那么您将如何检索超过 15 个限制的文档?比如说如果用户在 RecyclerView 中一直向下滚动,它会自动轮询 Firebase 以获取超过该点的更多数据 分页是这里的热门话题。你可以看看one of these answers以上是关于如何使用 RxJava 2 改进从 Firebase db 读取的 Flowable<Object> 数据?的主要内容,如果未能解决你的问题,请参考以下文章
在 Web 应用程序中使用 RxJava Observables 无法解释的性能改进不足
带有消息代理(例如 Kafka)的事件驱动微服务与反应式编程(RxJava、Project Reactor)以及改进的协议(RSocket)