我需要存储他自己异步的FireBase getValue方法的结果。我不能使用类似“onPostExecute()”的东西,为了我的目的,我无法执行我的所有操作“on onDataChange()”因为我将来需要一些参考其他活动。
这是我检索数据的代码段:
List<Village> villages = new LinkedList<>();
Firebase ref = new Firebase("MYFIREBASEURL").child("village");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
spinnerArray.clear();
for (DataSnapshot postSnapshot : snapshot.getChildren()) {
Village v = postSnapshot.getValue(Village.class);
villages.add(v);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
System.out.println("The read failed: " + firebaseError.getMessage());
}
});
如果我尝试从“onDataChange”中读取村庄,我自然会为他的异步生活读取空值。有一种方法可以确保调用onDataChange吗?。
答案 0 :(得分:20)
很抱歉,如果这不是你想要的,因为我的英语太差了。 您可以定义一个侦听器接口来处理它。 例如:
public interface OnGetDataListener {
public void onStart();
public void onSuccess(DataSnapshot data);
public void onFailed(DatabaseError databaseError);
}
我创建了一个自定义函数来获取Database.class中的数据:
public void mReadDataOnce(String child, final OnGetDataListener listener) {
listener.onStart();
FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
listener.onSuccess(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError databaseError) {
listener.onFailed(databaseError);
}
});
}
当我想从Main.class获取数据时,我会这样做:
private void mCheckInforInServer(String child) {
new Database().mReadDataOnce(child, new OnGetDataListener() {
@Override
public void onStart() {
//DO SOME THING WHEN START GET DATA HERE
}
@Override
public void onSuccess(DataSnapshot data) {
//DO SOME THING WHEN GET DATA SUCCESS HERE
}
@Override
public void onFailed(DatabaseError databaseError) {
//DO SOME THING WHEN GET DATA FAILED HERE
}
});
}
通过这种方式,您可以重用您的方法并处理数据。
答案 1 :(得分:2)
只是要添加Manh的答案,就可以在
之前调用onStart()
FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() {
在onStart()
中,通常会显示progressDialog:
if (mProgressDialog == null) {
mProgressDialog = new ProgressDialog(getContext());
mProgressDialog.setMessage(getString(R.string.loading));
mProgressDialog.setIndeterminate(true);
}
mProgressDialog.show();
在onSuccess()
中关闭对话框并将数据加载到GUI(或任何你想做的事情)
if (mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
答案 2 :(得分:0)
我所理解的是您正在尝试将快照数据保存到变量中,但由于异步任务,变量结果为空,这是因为异步任务的性质,您可以做的是传递快照数据从firebase侦听器函数到外部的自定义函数,并将快照数据存储到全局变量中。然后您可以按照自己的意愿使用该变量。