如何使用firebase同步数据

时间:2016-08-25 11:54:19

标签: android firebase firebase-realtime-database

我尝试从某个数据库引用中获取数据,但是当我执行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:

m2ZN-VWQ2QI.jpg

3 个答案:

答案 0 :(得分:2)

这听起来像是RXjava的一个很好的用例。

以下是rxjava和firebase的一些绑定:(注意我没有测试过它们 - 我自己写了)

  

https://gist.github.com/gsoltis/86210e3259dcc6998801   https://github.com/nmoskalenko/rxFirebase

然后,您可以使用zip / concat接收多个请求,然后将它们合并,最后对它们采取行动。

答案 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之间的差异。