我很抱歉,如果这似乎是一个愚蠢的问题,但是我还没有发现任何类似的问题,所以这里是。
我有一个从Firebase实时数据库检索数据(动物)的类数据库服务。从上一篇文章中,我了解到,由于这些API调用是异步的,因此应该创建一个接口以同步数据检索(ondatAckange()方法)
我的问题是:
- 为什么创建此接口并将其作为参数工作以同步数据检索?在我的代码中,为什么要调用Interfaces的方法oncallback(甚至在以后才定义)实现了它的实现是什么?
-
在将此类创建为数据库服务(因此名称)之后,我希望它返回一种动物列表(列表),以使其引起此服务的活动,缅甸效应,以制作回收。有什么办法可以将此接口方法中的" 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模式,并且您的代码将变得更加干净。