调用firebase getvalue oncreate

时间:2016-08-02 13:11:44

标签: java android firebase firebase-realtime-database

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)。

4 个答案:

答案 0 :(得分:0)

来自Firebase documentation for listening to value events

  

此方法在连接侦听器时触发一次,并在每次包括子项在内的数据发生更改时再次触发。

答案 1 :(得分:0)

您可以按照this steps访问数据一次。

正如@Frank所说,拥有一个监听器会在连接时和每次更改时为您提供访问权限。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在onCreate()方法中不会触发一次。如果没有removeEventListener,如果在OnCreate()方法中监听它,addValueEventListener将永远不会停止。当我运行它时,计数正在增加并且永不停止并且负载高达85%,所以我不得不关闭我的互联网并卸载它。但我enter image description here刚刚解决了。如果你想检查它,这是我的代码。

变量被声明为全局......

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时添加removeEventListener,否则它将永远不会停止。如果不在onStart()方法中调用removeEventListener,则不会出现问题。

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

如果您想要免费使用firebase,则无法让所有用户在没有必要的情况下下载您的数据,或者您的带宽可能在一天内变满。因此,我统计数据并只下载该子项的值并比较结果并进行更新。因此,当您调用addValueListener时,它可以减少带宽。