首页 > 解决方案 > 无法从方法返回相同的值,从它的子方法

问题描述

ArrayList<String> getthis=new ArrayList<String>();
getthis.add("username");
getthis.add("status");

*努力实现——

方法将采用 "username","status" 并从 FirebaseDatabase 获取它们的值作为新的类似数组,*

它这样做,它检索日志所说的值。这些是检查应用程序时的日志。

D/FirebaseHelper: Recived name=a@gmail.com
FinalArray have size 1 and Element is a@gmail.com
D/FirebaseHelper: Recived status=hi there buddy 
FinalArray have size 2 and Element is hi there buddy 

Ide 在 Logs 之前抛出 Log 之下

D/FirebaseHelper: At last FinalArray have size 0 and Element is []
Recived Array[]

但是最后,当 main 方法尝试返回 Main Array 时,它不能。

主要问题是——

Ide 显示没有错误。但是方法无法返回由子方法构造的新数组。即 OnValueEventListner。

这些是主要代码

package com.abhishekwork.forwork;

import android.util.Log;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

import androidx.annotation.NonNull;

public class HardWork {

    private static String tempString;


    public static ArrayList<String> getArrayFromFirebase(DatabaseReference databaseReference, final ArrayList<String> arrayList) {

        final int inputArraySize = arrayList.size();
        final ArrayList<String> finalArrayList = new ArrayList<>(inputArraySize);


        databaseReference.addValueEventListener(new ValueEventListener() {

            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (int i = 0; i < inputArraySize; i++) {
                    tempString = dataSnapshot.child(arrayList.get(i)).getValue().toString();
                    Log.d("FirebaseHelper","Recived"+arrayList.get(i) + "=" + tempString);

                    finalArrayList.add(i,Temp_String);
                    Log.d("FirebaseHelper","FinalArray has size" + finalArrayList.size() + " and Element is " + finalArrayList.get(i));
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });

        Log.d("FirebaseHelper", "At last FinalArray have size" + finalArrayList.size() + "and Element is " + finalArrayList.toString());

        Log.d("FirebaseHelper", "Recieved Array" + finalArrayList);

        return finalArrayList;
    }


}

标签: javaandroidfirebasefirebase-realtime-database

解决方案


当您调用addValueEventListener()DatabaseReference,您正在添加一个侦听onDataChange()器,该侦听器将在数据快照准备好时触发它的方法(或者onCancelled()如果出现错误,将触发 )。
这些事件是异步的,它们可能仅在您从方法返回后才会发生,这就是您获得空列表的原因。

获得所需结果的最简单方法是在结果准备好时使用回调来完成工作。
这是一个很好的答案,您可以参考。


推荐阅读