【问题标题】:Is it possible to send a synchronous request in the Firebase?是否可以在 Firebase 中发送同步请求?
【发布时间】:2016-03-03 18:08:11
【问题描述】:

我正在使用Firebase Android SDK,并开始对发送同步请求而不是异步请求感兴趣。根据文档,在任何请求中都会出现回调。但是同步性呢?

谢谢!

【问题讨论】:

  • 您为什么要这样做? Firebase 调用的异步特性使您的应用能够考虑响应时间(除其他外)。如果您给我们一个案例,我们可能会提供更多帮助。
  • @Jay 我只是为了感兴趣而获取此信息;)
  • 另请阅读本文了解更多信息:medium.com/google-developers/…
  • 此要求的特定用例是在后台接收和处理 Firebase 数据,而永久连接的意义不大。

标签: android firebase


【解决方案1】:

无法从 Firebase 数据库同步加载数据。

虽然 Firebase 的新开发人员通常希望使用同步方法,但它根本不适合 Firebase 的数据同步模型。也可以在这里查看我的答案:Setting Singleton property value in Firebase Listener

【讨论】:

    【解决方案2】:

    官方SDK无法同步加载数据。但是,您可以使用 REST API 访问 firebase 中的所有数据。这将允许您进行同步调用。如前所述,Firebase 是一个实时数据库,当您的数据发生变化时,您将失去更新功能。

    【讨论】:

    • 如果你提供一些代码会更好。
    • 解决与 Firebase 合作的挑战之一的绝妙技巧
    【解决方案3】:

    我做了一个简单的类来在 Android 中同步调用任务。
    请注意,这类似于Javascript 的异步等待功能。
    检查我的gist

    TasksManager.class

    public class TasksManager {
    
        ...
    
        public ExecutorService getExecutor() {
            if (mDefaultExecutor == null || mDefaultExecutor.isShutdown() || mDefaultExecutor.isTerminated()) {
                // Create a new ThreadPoolExecutor with 2 threads for each processor on the
                // device and a 60 second keep-alive time.
                int numCores = Runtime.getRuntime().availableProcessors();
                ThreadPoolExecutor executor = new ThreadPoolExecutor(
                        numCores * 2,
                        numCores * 2,
                        60L,
                        TimeUnit.SECONDS,
                        new LinkedBlockingQueue<>()
                );
                mDefaultExecutor = executor;
            }
            return mDefaultExecutor;
        }
    
        public static <TResult> Task<TResult> call(@NonNull Callable<TResult> callable) {
            return Tasks.call(getInstance().getExecutor(), callable);
        }
    }
    

    这是使用它的示例代码。

    TasksManager.call(() -> {
        Tasks.await(AuthManager.signInAnonymously());
    
        // You can use multiple Tasks.await method here.
        // Tasks.await(getUserTask());
        // Tasks.await(getProfileTask());
        // Tasks.await(moreAwesomeTask());
        // ...
    
        startMainActivity();
        return null;
    }).addOnFailureListener(e -> {
        Log.w(TAG, "signInAnonymously:ERROR", e);
    });
    

    【讨论】:

      【解决方案4】:

      虽然无法以同步方式从 FirebaseDatabase 加载数据,但可以等待加载同步完成。

      您可以将您的值侦听器包装在 CountDownLatch 中并倒计时, 一旦调用了onDataChangeonCancelled 实现。

      如果您调用Tasks.await(someTask),这实际上是 Tasks api 在内部执行的操作。

      您应该使用值侦听器来侦听单个事件,因为在这种情况下,我假设您不希望继续更新。并为 CountDownLatch 使用适当的超时,因为 Firebase 不会超时,永远

      reference.addListenerForSingleValueEvent(...);
      

      您还必须考虑到,如果您有 FirebaseDatabase 缓存,第一个结果可能不是实际值 服务器。

      我必须补充一点:虽然这可能可行,但正如弗兰克已经说过的那样,这与 firebase 的设计和使用方式背道而驰。

      【讨论】:

      • 如果您的设置需要查询多个 firebase 端点并根据您获得的数据返回组合响应 - 那么同步调用是有意义的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 2011-03-28
      • 2012-07-17
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多