我尝试从某个数据库引用中获取数据,但是当我执行onDataChange
它的同步方法时,所有我的逻辑应用程序都会崩溃。我想先做fast_get_innfouser
方法,然后get_all_user
,然后再做root.addValueEventListener(
。我该怎么做?
有代码:
public class chatRooms extends Activity {
private DatabaseReference root = FirebaseDatabase.getInstance().getReference();
private FirebaseDatabase database;
public FirebaseAuth auth;
private ChatInfo ChatInfo = new ChatInfo();
private ListView listView;
private ArrayAdapter<String> arrayAdapter;
private FirebaseUser user;
private ArrayList<String> all_uid = new ArrayList<>();
private User us ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_rooms);
auth = FirebaseAuth.getInstance();
user = auth.getCurrentUser();
if (user != null) {
database = FirebaseDatabase.getInstance();
root.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
get_all_user(database.getReference());
fast_get_innfouser(database.getReference(user.getUid()));
return null;
}
@Override
public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
root = database.getReference(user.getUid()).child("chat");
}
});
}
root.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange (DataSnapshot dataSnapshot){
/*........some code here...........*/
}
});
}
private void get_all_user(DatabaseReference reference) {
all_uid = new ArrayList<>();
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot messageSnapshot : dataSnapshot.getChildren()) {
//some code here
}
}
});
}
private void fast_get_innfouser(DatabaseReference myRef) {
final Integer[] temp = {1};
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot messageSnapshot : dataSnapshot.getChildren()) {
//some code here
}
JSON:
答案 0 :(得分:2)
这听起来像是RXjava的一个很好的用例。
以下是rxjava和firebase的一些绑定:(注意我没有测试过它们 - 我自己写了)
https://gist.github.com/gsoltis/86210e3259dcc6998801 https://github.com/nmoskalenko/rxFirebase
答案 1 :(得分:1)
尝试移动get_all_user(database.getReference());内部onDataChange里面的方法fast_get_innfouser方法
答案 2 :(得分:0)
我建议您检查下一个使用RxJava的Reactive模型的库之一(或者只是使用它):
RxJava:https://github.com/nmoskalenko/RxFirebase
RxJava 2.0:https://github.com/FrangSierra/Rx2Firebase
其中一个使用RxJava,另一个使用RxJava 2.0的新RC。如果您对此感兴趣,可以看到here之间的差异。