Java ValueEventListener无限循环

时间:2018-02-27 12:36:01

标签: java firebase firebase-realtime-database

我的Firebase代码无法向用户个人资料添加联系人。这个确切的代码用于工作正常,现在它到今天它自己进入一个无限循环并重复创建联系人,直到我强制杀死应用程序。我无法解决循环的位置,或者可能已经改变的地方!

代码:

public class AddContacts extends AppCompatActivity {

private EditText addContactNumber;
private Button btnAddContact;
private String userResult, searchPhone, ping_userID;
private FirebaseAuth pingAuth;
DatabaseReference ref;
private FirebaseAuth.AuthStateListener pingAuthListener;

    addContactNumber = (EditText) findViewById(R.id.addContactNumber);
    btnAddContact = (Button) findViewById(R.id.btnAddContact);



    btnAddContact.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            searchPhone = addContactNumber.getText().toString();
            ref = FirebaseDatabase.getInstance().getReference().child("Profiles");
            ref.orderByChild("Phone").equalTo(searchPhone).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot datas : dataSnapshot.getChildren()) {
                        userResult = datas.getKey();
                        if (userResult != null) {
                            ping_userID = pingAuth.getCurrentUser().getUid();
                            DatabaseReference newContact = FirebaseDatabase.getInstance().getReference().child("Profiles").child(ping_userID).child("Contacts");
                            newContact.setValue(userResult);
                            DatabaseReference newContactPing = FirebaseDatabase.getInstance().getReference().child("Profiles").child(ping_userID).child("Contacts").child(userResult).child("PingStatus");
                            newContactPing.setValue(false);
                            DatabaseReference addRef = FirebaseDatabase.getInstance().getReference().child("Profiles").child(userResult).child("Name");
                            addRef.addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot dataSnapshot) {
                                    String resultName = dataSnapshot.getValue(String.class);
                                    DatabaseReference addContactName = FirebaseDatabase.getInstance().getReference().child("Profiles").child(ping_userID).child("Contacts").child(userResult).child("Name");
                                    addContactName.setValue(resultName);
                                    Toast.makeText(getBaseContext(), "User: " + resultName + " added successfully.", Toast.LENGTH_SHORT).show();
                                    ref.removeEventListener(this);
                                }

                                @Override
                                public void onCancelled(DatabaseError databaseError) {

                                }
                            });
                        } else {
                            Toast.makeText(getBaseContext(), "User not found.", Toast.LENGTH_SHORT).show();
                            ref.removeEventListener(this);
                            break;
                        }
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    });
}

另外,也许作为一个旁边,它永远不会触发"用户未找到" event,即使我输入了数据库中没有的详细信息。

有什么想法吗?我确信它正盯着我,但我不明白。

@Peter Haddad数据库按要求:

MyAppDatabase
  -Profiles
    -BCsuC4XAZqVhWj
      -Name: "Simon"
      -Phone:  123456
      -Contacts
        -pnYn1NhzzNQAm
          -Name: "Bill"
          -PingStatus: false

     -pnYn1NhzzNQAm
       -Name:  "Bill"
       -Phone:   987654
       -Contacts
          -BCsuC4XAZqVhWj
            -Name: "Simon"
            -PingStatus: false

1 个答案:

答案 0 :(得分:0)

在两种情况下都使用addListenerForSingleValueEvent代替addValueEventListener