Android Firebase 检索同步并"returning"的数据



我很抱歉,如果这似乎是一个愚蠢的问题,但是我还没有发现任何类似的问题,所以这里是。

我有一个从Firebase实时数据库检索数据(动物)的类数据库服务。从上一篇文章中,我了解到,由于这些API调用是异步的,因此应该创建一个接口以同步数据检索(ondatAckange()方法)

我的问题是:

  1. 为什么创建此接口并将其作为参数工作以同步数据检索?在我的代码中,为什么要调用Interfaces的方法oncallback(甚至在以后才定义)实现了它的实现是什么?
  2. 在将此类创建为数据库服务(因此名称)之后,我希望它返回一种动物列表(列表),以使其引起此服务的活动,缅甸效应,以制作回收。有什么办法可以将此接口方法中的" void"更改为"列表"以具有

    之类的东西
    List<Animal> listAnimals = databaseService.readData(); 
    

    或应该删除整个数据库服务类,然后为了在OndatAchange()方法中的全局列表中添加动物对象?

数据库服务:

public class DatabaseService {
    private FirebaseDatabase firebaseDatabase;
    private DatabaseReference firebaseRootRef;
    private DatabaseReference animalsRef;
    List<Animal> animalsList;
    public DatabaseService() {
        this.firebaseDatabase = FirebaseDatabase.getInstance();
        this.firebaseRootRef = firebaseDatabase.getReference();
        this.animalsRef = firebaseDatabase.getReference("animals");
        animalsList = new ArrayList<>();
    }

    private interface FirebaseCallback {
        void onCallback(List<Animal> list);
    }
    public void readItemsFromDatabase(final FirebaseCallback firebaseCallback) {
        ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                animalsList.clear();
                //dataSnapshot.getChildren() ---> iterate through entire dataSnapshot Object, to get the items names
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    Animal animal;
                    animal = ds.getValue(Animal.class);
                    animalsList.add(animal);
                }
                firebaseCallback.onCallback(animalsList);
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d("DATABASE_TAG", databaseError.getMessage());
            }
        };
        animalsRef.addValueEventListener(valueEventListener);
    }

    public void readData() {
        readItemsFromDatabase(new FirebaseCallback() {
            @Override
            public void onCallback(List<Animal> list) {
                Log.d("DATABASE_TAG", list.toString());
            }
        });
    }
}

缅因症:

public class MyAnimalsActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.Adapter animalAdapter;
private List<Animal> listAnimals;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_animals);
    DatabaseService databaseService = new DatabaseService();
    databaseService.readData();

    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true); //every item of the recyclerview has a fixed size;
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    listAnimals = new ArrayList<>();
    //listAnimals  =  databaseService.readData();  ??

}
}

编写一种返回异步值的方法,如果您在具有数据之前调用它,可能会导致nullpointers。

要使此简单,因为方法readItemsFromDatabase是公开的,您可以从MyAnimalsActivity调用它并从那里获取数据。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_animals);
    DatabaseService databaseService = new DatabaseService();
    databaseService.readItemsFromDatabase(new DatabaseService.FirebaseCallback() {
            @Override
            public void onCallback(List<Animal> list) {
                Log.d("DATABASE_TAG", list.toString());
            }
        });
...

我已经将您的问题与我的一个项目隔离开来,它正在奏效;另外,您可以检查将为您解决所有这些问题的MVP模式,并且您的代码将变得更加干净。

最新更新