android firebase 中未触发`addListenerForSingleValueEvent()`

时间:2020-12-25 09:50:26

标签: android firebase firebase-realtime-database

同样的代码以前可以工作,但现在突然停止工作,没有改变任何东西!

我的代码是:

private void readData(final ReadData read) {
    Log.i("test", "Users 1: " + ref);
    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            users.clear();
            totalUsers.clear();
            Log.i("test", "Users 2: " + ref);
            for (DataSnapshot items : snapshot.getChildren()) {
                if (items.exists()) {
                    UserChangeInfo user = items.getValue(UserChangeInfo.class);
                    assert user != null;
                    totalUsers.add(user);
                    if (!user.getNewPassword().equals("")) {
                        users.add(user);
                    }
                }
            }
            read.onCallback();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            Log.i("test", "Error 1: " + error.getMessage());
            Log.i("test", "Error 2: " + error.getDetails());
        }
    });

}

在这里,Log.i("test", "Users 1: " + ref); 被执行。但是Log.i("test", "Users 2: " + ref);Log.i("test", "Error 1: " + error.getMessage());Log.i("test", "Error 2: " + error.getDetails()); 不会被执行。

所以,addListenerForSingleValueEvent() 似乎没有被触发。 我被困在这里好几天了。 为什么??

我是这样读的:

readData(new ReadData() {
            @Override
            public void onCallback() {
                Log.i("test", "Users 3: " + ref);
                adapter.notifyDataSetChanged();
                String s = "Total Users: " + totalUsers.size() + "\n\n\nUpdate Request: " + users.size();
                txtTotalChangeReq.setText(s);

                if(users.size() > 0){
                    lstUpdateRequestList.setVisibility(View.VISIBLE);
                    lstTotalUserList.setVisibility(View.GONE);
                    showRequestedUsers.setChecked(true);
                    showAllUser.setChecked(false);
                    showInactiveUsers.setChecked(false);
                    String ss = "Change request list";
                    listLabel.setText(ss);
                }
                else{
                    lstTotalUserList.setVisibility(View.VISIBLE);
                    lstUpdateRequestList.setVisibility(View.GONE);
                    showAllUser.setChecked(true);
                    showRequestedUsers.setChecked(false);
                    showInactiveUsers.setChecked(false);
                    String ss = "Total user list";
                    listLabel.setText(ss);
                }
            }
        });
        Log.i("test", "Users 4: " + ref);

但是这里 Log.i("test", "Users 3: " + ref); 没有被执行,这里也没有被执行,但是这个调用 Log.i("test", "Users 4: " + ref); 被执行了。

注意:W/System: Ignoring header X-Firebase-Locale because its value was null. 有一个警告,但每个人都说这个警告与我的代码无关。

不适用:

  1. 将引用声明为:ref = FirebaseDatabase.getInstance().getReference().child("change request");
  2. ref 不为空:ref = https://myFirebaseAppLink/change%20request
  3. 允许身份验证。
  4. 使用了依赖项: implementation platform('com.google.firebase:firebase-bom:26.1.1') 和其他 Firebase 依赖项。
  5. Wi-Fi 连接正常。 (其他 Firebase 应用也可以使用)。
  6. 应用已与 Firebase 相关联。

1 个答案:

答案 0 :(得分:0)

我遇到了几乎类似的问题。使用临时的 ArrayList 例如:tmp1,tmp2 而不是 userstotalUsers,然后将这两个 ArrayList 传递给 read.onCallback(tmp1,tmp2).[inside private void readData 方法(第一个代码)]。然后在你的 readData>onCallBack[2nd code]

users.clear();
totalUsers.clear();
users.addAll(tmp1);
totalUsers.addAll(tmp2);

然后做你的工作。