【问题标题】:android firebase thread callback to another thread than main?android firebase线程回调到另一个线程而不是main?
【发布时间】:2020-08-23 07:23:25
【问题描述】:

据此:

Firebase 数据库客户端执行所有网络和磁盘操作 关闭主线程。 Firebase 数据库客户端调用所有 在主线程上回调您的代码。

因此数据库的网络和磁盘访问没有理由启动 您自己的线程或使用后台任务。但是如果你做磁盘,网络 回调中的 I/O 或 CPU 密集型操作,您可能需要 自己在主线程之外执行这些操作。

是的,这正是它的作用:

FireBaseValueEventListenerW postListener = new FireBaseValueEventListenerW() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            ****          MAIN THREAD     *****
                        }
                    };

                     ****          RANDOM THREAD     *****
                    ref.childInfoIndex()
                        .orderByChild(ReferenceInfo.Index.ref)
                        .limitToFirst(1)
                        .addListenerForSingleValueEvent(postListener);

这就是我的问题。有没有办法强制firebase在发出请求的同一个线程中回答? 一种简单的方法,无需强迫您每个人将逻辑写入可运行文件中以将其推回应有的位置。

谢谢。

【问题讨论】:

  • 似乎是个糟糕的主意,你为什么要这样做。最好让文档保持原样,使用 rxjava 或协程进行后期处理。
  • 因为我在答案中所做的工作与主线程无关;)。不管怎样,我找到了我喜欢的方式。

标签: android multithreading firebase


【解决方案1】:

所以一个适合我的答案给了我很少和快速的重构:

总结一下:

  • 只需扩展监听器

  • 给它你想要的处理程序

  • 覆盖 onDataChange 并将其标记为 final

  • 给出另一个在你的线程中完成的方法

    公共抽象类 FireBaseValueEventListenerW 实现 ValueEventListener { 私有处理程序处理程序; 公共 FireBaseValueEventListenerW() { 这(空); } 公共 FireBaseValueEventListenerW(处理程序处理程序){ TrackClass.create(this); this.handler = 处理程序; } @覆盖 final public void onDataChange(@NonNull DataSnapshot 快照) { if(handler != null) handler.post(this, new RunnableW() { @Override 公共无效运行(){ onDataChangeThread(快照); } }); 否则 onDataChangeThread(快照);; } public void onDataChangeThread(@NonNull DataSnapshot 快照) {

      }
    
    
      @Override
      public void onCancelled(@NonNull DatabaseError databaseError) {
    
      }
      @Override
      protected void finalize() throws Throwable {
          TrackClass.destroy(this);
          super.finalize();
      }
    

    }

【讨论】:

  • 由于某种原因,这段代码不想用应答码格式化...经过 3-4 次尝试,我给了。
猜你喜欢
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多