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

即使在我的工作管理器中连接到互联网,数据快照也不会更新

阳英朗
2023-03-14

通过调试,我可以看到它输入了所有这些,但snapshot有一个旧值。我在firebase数据库中启用了持久性。发生了什么?

这是我的工人阶级客栈代码,我在共享首选项中保存了一些数据。但例如,它输入ref1,但snapshot具有旧值。

public class Manager extends Worker {

    FirebaseDatabase database = FirebaseDatabase.getInstance();

    public Manager(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    ValueEventListener v1, v2, v3;



    @NonNull
    @Override
    public Result doWork() {

        boolean flag = getInputData().getBoolean("flag", false);

        CountDownLatch latch;

        if (isConnectedToWifi() || flag)
            latch = new CountDownLatch(3);
        else
            latch = new CountDownLatch(1);

        DatabaseReference ref1 = database.getReference("BASE/previous");
        ref1.addValueEventListener(v1 = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if (snapshot.exists()) {
                    ...
                }
                latch.countDown();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                //
                latch.countDown();
            }
        });


        DatabaseReference ref2 = null, ref3 = null;

        if (isConnectedToWifi() || flag) {


            ref2 = FirebaseDatabase.getInstance().getReference("BASE/syntelestes");
            ref2.addValueEventListener(v2 = new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    if (snapshot.exists()) {
                        ...
                    }
                    latch.countDown();
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {
                    //
                    latch.countDown();
                }
            });


            ref3 = FirebaseDatabase.getInstance().getReference("BASE/food_list");
            ref3.addValueEventListener(v3 = new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    if (snapshot.exists()) {

                        ...
                    }
                    latch.countDown();
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {
                    //
                    latch.countDown();
                }
            });

        }


        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        if (v1 != null) {
            ref1.removeEventListener(v1);
        }

        if (v2 != null && ref2 != null) {
            ref2.removeEventListener(v2);
        }

        if (v3 != null && ref3 != null) {
            ref3.removeEventListener(v3);
        }

        return Result.success();
    }

    public boolean isConnectedToWifi() {
        ConnectivityManager connManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        return mWifi.isConnected();
    }

是否不需要查看细节(数据输入,…,工人内部工作等)。

共有1个答案

莘俊能
2023-03-14

如果已启用磁盘持久性,并且本地缓存中存储了一个值,则向addValueEventListener注册的侦听器的onDataChange将被调用两次:

  1. 立即使用本地缓存中的当前值

没有办法改变addValueEventListener的这种行为。跳过#1

如果您想从服务器获取值,并且仅在服务器不可用时回退到磁盘缓存,请考虑使用更新的get()操作来执行此操作。

 类似资料:
  • 水槽新手。 假设我有一个代理,它有一个 avero 源、一个 hdfs 接收器和一个文件通道。 假设在某个时候接收器无法写入hdfs。源是否会继续接受事件,直到通道填满? 或者即使文件通道未满,源也会停止接受事件吗?

  • 我在使用桌面JavaFX应用程序时,与Oracle数据库的HikariCP连接有问题。 堆栈: 当尝试进行db查询时WiFi互联网连接丢失时,Hikari声明: 在WiFi重新连接后,它不使用相同的连接,Oracle数据库上的会话是活的(没有关闭互联网丢失的原因),但创建新的连接: 所以Hikari创建了新的连接,在Oracle中,我看到了两个相同应用程序的会话。关闭JavaFX应用程序后,第一个

  • 问题内容: 我已经有了这段侦听连接性更改的代码- 我使用此代码检查连接- 但是问题是,如果网络突然失去了互联网连接而没有任何连接更改,则此代码将无用。有什么方法可以创建广播接收器侦听器以更改Internet连接吗?我有一个Web应用程序,突然的Internet连接更改会引起问题。 问题答案: 尝试这个 对于广播接收器 不要忘记将其放入你的AndroidManifest.xml 希望这会为你加油!

  • 我想将我的hsql数据库与eclipse hsql数据库管理器连接到eclipse,我认为代码非常正确,但它给了我这个错误: 线程“main”java.lang.NullPointerException中出现异常:无法调用“java.sql.Connection.CreateStatement()”,因为“this.con”在Peralinq.Main.Main(Main.java:30)的Per

  • 若要使用PS Vita与互联网连接,需先准备无线通信的环境。 若您的住家等地无法通过无线通信,可使用公众无线LAN服务(Hotspot)在公众场所与互联网连接。 公众无线LAN服务的使用方法与费用会因该服务的提供者而异。详细请询问该服务的提供者。 使用Wi-Fi连接 若要使用Wi-Fi与互联网连接,需准备以下内容。此外,接入点的设定通常会通过电脑进行。 与网络服务商签订合约 接入点或无线路由器 接

  • 问题内容: 问题: 当我将作业提交到hadoop 2.2.0集群时,它没有显示在作业跟踪器中, 但是作业成功完成。 这样,我可以看到输出并且它正在正确运行,并在运行时打印输出。 我尝试了多个选项,但作业跟踪器看不到该作业。如果我使用2.2.0 hadoop运行流作业,它将显示在任务跟踪器中,但是当我通过hadoop-client api提交它时,它不会显示在作业跟踪器中。我正在查看端口8088上的