未编译addValueEventlistener,编译器直接转到下一步

时间:2019-02-27 08:13:51

标签: android firebase

switch (v.getId()) {
    case R.id.signUpBtn:

        database = FirebaseDatabase.getInstance().getReference();
        myRef = database.child("users");
        users = new Users();
        getValue();
        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                myRef.setValue(users);
                Toast.makeText(getActivity(), "Data inserted....", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        // Call checkValidation method
        checkValidation();


        break;

我试图使用断点无济于事,编译器直接跳到checkValidation(),跳过了addValueEventlistener!?

1 个答案:

答案 0 :(得分:0)

这是真的,这是因为onDataChange是异步的,这意味着编译器将移至另一个任务,而不会等待onDataChange来检索其数据。

添加Log的示例:

switch (v.getId()) {
case R.id.signUpBtn:
    database = FirebaseDatabase.getInstance().getReference();
    myRef = database.child("users");
    users = new Users();
    getValue();
    Log.d(TAG,"Before add value listener");

    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            myRef.setValue(users);
            Log.d(TAG,"inside retrieving data");
            Toast.makeText(getActivity(), "Data inserted....", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
    // Call checkValidation method
    Log.d(TAG, "outside retrieving data");
    checkValidation();

    break;

这将按以下顺序打印日志:

  

在添加值侦听器之前

     

外部检索数据

     

内部检索数据

要解决此问题,请在checkValidation();内添加onDataChange,例如:

    myRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        myRef.setValue(users);
        Log.d(TAG,"inside retrieving data");
        Toast.makeText(getActivity(), "Data inserted....", Toast.LENGTH_LONG).show();  
        checkValidation();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});