如何使用 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> 数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用rxjava改进多个图像上载问题

在 Web 应用程序中使用 RxJava Observables 无法解释的性能改进不足

如何使用 Retrofit 2 和 RxJava 处理分页

带有消息代理(例如 Kafka)的事件驱动微服务与反应式编程(RxJava、Project Reactor)以及改进的协议(RSocket)

Novate:Retrofit2.0和RxJava的又一次完美改进加强(Tamic博客 -CSDN)

如何在 RxJava 2 和 Android 中延迟 onError()?