当前位置: 首页 > 知识库问答 >
问题:

如何绕过Firebase缓存刷新数据(在Android应用程序中)?

韦知
2023-03-14
User myUser =  MyclientFacade.getUser();
If (myUser.getScore > 10) {
    DoSomething() 
}
Firebase.getDefaultConfig().setPersistenceEnabled(true);

让我们看看同步方法MyClientFacade.getUser():

Public User  getUser()  {
  Firebase ref = myFireBaseroot.child("User").child(uid);
  ref.keepSynced(true);
  /* try {
    Thread.sleep(3000);
 } catch (InterruptedException e) {
    e.printStackTrace();
 }*/
final CountDownLatch signal = new CountDownLatch(1);

ref.addListenerForSingleValueEvent(new ValueEventListener() {
//ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       this.user = dataSnapshot.getValue(User.class);
       signal.countDown();
    }
    @Override
    public void onCancelled(FirebaseError firebaseError) {
       signal.countDown();
    }
});
signal.await(5, TimeUnit.SECONDS);
ref.keepSynced(false);
return this.user;
}

如果使用AddValueEventListenerAddListenerForSingleValueEvent混合使用Ref.KeepSynced,则获得相同的行为:

假设我的用户在缓存中的得分值是5,而Firebase DB的得分值是11。

如果取消示例中thread.sleep()代码的注释,Firebase缓存将有足够的时间更新,并且我的getUser将返回正确的得分值(11)。

那么如何直接从服务器端直接询问最新的值并绕过缓存呢?

共有1个答案

马涵蓄
2023-03-14

这也是一个问题,在我的申请中给我带来了很大的压力。

我尝试了一切,从将.AddListenerForSingleValueEvent()改为.AddValueEventListener()到尝试创造性地使用.KeepSynced()再到使用延迟(Thread.Sleep()方法,都没有真正一致地工作(即使是Thread.Sleep()方法,这在生产应用程序中是不可接受的,Thread.Sleep()方法也没有给出一致的结果)。

所以我所做的是:在创建一个查询对象并对其调用.keepsynced()之后,我继续在我所查询的节点中编写一个mock/token对象,然后在该操作的完成监听器中,在删除mock对象之后,执行我想要执行的数据检索。

类似于:

 MockObject mock = new MockObject();
    mock.setIdentifier("delete!");

    final Query query = firebase.child("node1").child("node2");

    query.keepSynced(true);

    firebase.child("node1").child("node2").child("refreshMock")
            .setValue(mock, new CompletionListener() {

                @Override
                public void onComplete(FirebaseError error, Firebase afb) {

                    query.addListenerForSingleValueEvent(new ValueEventListener() {

                        public void onDataChange(DataSnapshot data) {

                            // get identifier and recognise that this data
                            // shouldn't be used
                            // it's also probably a good idea to remove the
                            // mock object
                            // using the removeValue() method in its
                            // speficic node so
                            // that the database won't be saddled with a new
                            // one in every
                            // read operathtml" target="_blank">ion

                        }

                        public void onCancelled(FirebaseError error) {
                        }

                    });

                }

            });
}

到目前为止,这对我一直有效!(嗯,一天左右,所以对此半信半疑)。似乎在读取之前执行写操作会绕过缓存,这是有意义的。所以数据是新鲜的。

唯一的缺点是读操作之前的额外写操作,这可能会导致很小的延迟(显然使用一个小对象),但如果这是总是新鲜数据的代价,我会接受的!

 类似资料:
  • 我最近编写了一个Android应用程序。这只是一个简单的应用程序,让你保持几个简单的计数器间隔的篮球比赛得分。我得到了增加一个保存功能的需求,这样你就可以保存你的分数,然后加载他们回来。目前,当您停止应用程序时,您的数据将丢失。所以我想知道的是我必须添加什么才能让应用程序保存标签(分数),然后加载它。谢谢,伙计们,对不起,我对这些东西不太了解。

  • 有没有办法从Firebase检索数据到一个Java应用程序? 我有一个Android应用程序,它将数据存储到一个Firebase数据库中,我需要在一个Java应用程序中读取这些数据。我在网上查了一下,但没有找到一个明确的答案。 //不是浏览器的URL,而是数据库上方的URL //这里我尝试引用数据库并在其中放入一个值

  • 问题内容: 我有一个ac#实体框架应用程序。我正在尝试从代码运行存储过程(没有问题)。它长期运行,大约30分钟。随着过程的进行,我将每个事务的日志写入SQL表。我希望从该应用程序启动该过程,但随后在屏幕上显示登录的最后10条记录,可能每10秒重新查询一次。这将显示进度。 我更改了代码以简化。线程在dispatcherTime_Tick进程上阻塞。看起来存储过程很好。 这就是所谓的服务。 我一直在执

  • 本文向大家介绍如何刷新浏览器的应用缓存?相关面试题,主要包含被问及如何刷新浏览器的应用缓存?时的应答技巧和注意事项,需要的朋友参考一下 按F5或浏览器刷新按钮 浏览器会在请求中附加必要的缓存协商,但不允许浏览器直接使用本地缓存,它能够让 Last-Modified、ETag发挥效果,但是对Expires无效。 按Ctrl+F5或按Ctrl并点击刷新按钮 这种方式就是强制刷新,总会发起一个全新的请求

  • 请让我知道如何使用spring boot和ehcache实现这一点。

  • 问题内容: 我有一个内置于firebase和angular中的应用程序,并且希望能够在刷新页面后使用户保持登录状态。现在我有一个登录屏幕,其中包含两个基本输入字段,这些输入字段绑定到控制器 这一切都很好,很不错,并且可以,但是当用户刷新页面时,他们将被注销。有什么方法可以在加载控制器时查看用户是否已经登录并自动重定向?谢谢! 问题答案: 您现在拥有的代码可以处理用户登录的情况。要处理用户已经登录的