Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在没有OnClickListener的Android应用程序中检索Firebase数据_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 在没有OnClickListener的Android应用程序中检索Firebase数据

Java 在没有OnClickListener的Android应用程序中检索Firebase数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我试图获得Firebase数据库表中特定列的总和,以生成Android应用程序中某个值的平均值(与当前读数对比)。作为一个测试,我想在我的测试应用程序的文本视图中显示这个总和。当我第一次声明addValueEventListener时: reff.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot sna

我试图获得Firebase数据库表中特定列的总和,以生成Android应用程序中某个值的平均值(与当前读数对比)。作为一个测试,我想在我的测试应用程序的文本视图中显示这个总和。当我第一次声明addValueEventListener时:

 reff.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {


            for (DataSnapshot snapshot2:  snapshot.getChildren()){
                sum = sum + snapshot2.child("age").getValue(Integer.class);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });
然后进行数据库setValue()调用,并在onClickListener中设置textView,这将按预期工作

 button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            reff.child(String.valueOf(maxid+1)).setValue(member);
            Toast.makeText(MainActivity.this, "data inserted successfully", Toast.LENGTH_LONG).show();
            a.setText(String.valueOf(sum));

        }
    });
但是,在我的应用程序中,我不希望通过单击按钮触发“总和”值。我希望这是目前,以便我可以比较新的数据与滚动平均从我的数据库。如果我将上述代码从OnClickListener移动到我的主onCreate方法中,sum的值将保持为0。在阅读各种线程时,我还将addValueEventListener()替换为addListenerForSingleValueEvent(),但这没有任何影响


有谁能建议一种方法,我可以重新格式化它,而不必依靠按下按钮从我的表中获取总和?

a.setText()
的调用需要在
onDataChange
中,因为当更新的数据来自数据库时,这是唯一保证执行的代码

因此:

另外:请永不
onCancelled
保留为空,因为这样会忽略潜在的错误


另请参见:,我将以重复的方式结束您的问题-我只是想用代码向您展示相关的解决方案。

这非常有帮助,谢谢!只是,作为后续,并不是说我的初始代码非常有洞察力,而是我还想尝试使用计数器对象(在我的示例中为“maxid”)来识别每个数据库条目,而不是随机生成每个数据库条目的Firebase值。问题在于能否将getChildrenCount()的数值传递到onDataChange()之外。我也读了你关于这个问题的另一篇文章。如果我尝试使用精确的getChildrenCount()对onDataChange()内的数据库进行更改,则会出现一个无限循环。是的,最重要的是,使用数据库中数据的任何代码都必须位于
onDataChange
内,或者从那里调用。范围(使用变量的代码所在的位置)没有多大关系,但是只有从
onDataChange
触发它,时间才会正确。
reff.addValueEventListener(new ValueEventListener() {

    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot snapshot2:  snapshot.getChildren()){
            sum = sum + snapshot2.child("age").getValue(Integer.class);
        }
        a.setText(String.valueOf(sum));
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException();
    }
});