繁体   English   中英

在create上调用firebase getvalue

[英]Call firebase getvalue oncreate

mRefQ.addValueEventListener(new ValueEventListener() {


    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String txt = dataSnapshot.getValue(String.class);
        showtext.setText(txt);
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
});

就目前而言,我只能在数据更改时访问值,但是我想在需要时访问它(即oncreate)。

Firebase文档中收听值事件

附加了侦听器后,将触发此方法,而每次更改数据(包括子级)时,都会触发此方法。

按照以下步骤,您只能访问一次数据。

正如@Frank提到的那样,有一个监听器可以使您在连接时以及每次更改时都具有访问权限。

请记住, 所有这些操作都是异步发生在一个单独的线程上的,因此,为了确保该值在onCreate上可用,您可能必须自己进行编排并按住主线程,直到准备好使用这些值为止。

好吧,事实证明它在创建时确实会调用它,我只需要等待Firebase在应用程序上加载

它不会在onCreate()方法中触发一次。 没有removeEventListener,如果您在OnCreate()方法中侦听addValueEventListener,它将永远不会停止。 计数不断增加,永不停止,运行时负载高达85%,因此必须关闭互联网并卸载它。 但是我在这里输入图像描述 t刚刚解决。 这是我的代码,如果您想检查一下。

变量声明为全局...

private DatabaseReference main;
private ValueEventListener valueEventListener;

在onCreate()方法中.....

valueEventListener = main.addValueEventListener(new 
ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
           boolean countExists = false;
           int count = 1; //starts from 1 when data is uploaded for the first time
           for (DataSnapshot out: dataSnapshot.getChildren()) {
               if (out.getKey().equals("count")) {
                   String temp = out.getValue(String.class);
                   countExists = true;
                   try {
                       count = Integer.parseInt(temp);
                   }
                   catch (NumberFormatException e) {
                       count = 1;
                   }
                   break;
               }
           }

           if (!countExists) {
               main.child("count").setValue(String.valueOf(count));
               Toast.makeText(getApplicationContext(), "Count Created", Toast.LENGTH_SHORT).show();
               upload.setClickable(true);
           }
           else {
               main.child("count").setValue(String.valueOf(++count));
               Toast.makeText(getApplicationContext(), "Count Updated", Toast.LENGTH_SHORT).show();
               upload.setClickable(true);
           }
           main.removeEventListener(valueEventListener);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(getApplicationContext(), "Failed to upload", Toast.LENGTH_SHORT).show();
        }
    });

确保在onCreate()方法中调用时添加removeEventListener,否则它将永不停止。 如果您不在onStart()方法中调用removeEventListener,则不会有问题。

这不是你的问题,但是...

如果您想免费使用Firebase,则不能让所有用户不必要地下载您的数据,否则您的带宽可能在一天内耗尽。 因此,我对数据进行计数,然后下载该孩子的值,然后比较结果并进行更新。 因此,当您调用addValueListener时,它可以减少带宽。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM