【问题标题】:Debugger shows null value despite having value in Firebase Database尽管在 Firebase 数据库中有值,但调试器显示空值
【发布时间】:2023-03-06 20:08:01
【问题描述】:

我试图通过意图发送一个值,但我的应用程序崩溃了。所以,我尝试检查调试器中的值,它显示为空。这是图片。

如您所见,它显示了userId = "null"profilephotoURl ="null"为什么会这样?

这是数据库的图像。

这是代码

ProfileInfo.class

public class ProfileInfo {

String userName, profilePhotoUrl, phoneNumber, userId;

public ProfileInfo() {}

public ProfileInfo(String userName, String profilePhotoUrl, String phoneNumber, String userId) {
    this.userName = userName;
    this.profilePhotoUrl = profilePhotoUrl;
    this.phoneNumber = phoneNumber;
    this.userId = userId;
}

public ProfileInfo(String userName, String phoneNumber) {
    this.userName = userName;
    this.phoneNumber = phoneNumber;
}


public String getUserId() {
    return userId;
}

public String getPhoneNumber() {
    return phoneNumber;
}

public String getUserName() {
    return userName;
}

public String getProfilePhotoUrl() {
    return profilePhotoUrl;
}

UserAdapter.class

public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.ViewHolder> {

    private ArrayList<ProfileInfo> minfo;
    public static final String USER_ID = "userid";
    Context context;

    public UsersAdapter(Context context, ArrayList<ProfileInfo> minfo) {
        this.context = context;
        this.minfo = minfo;
    }


    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_item, parent, false);
        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);
        view.setLayoutParams(lp);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
        final ProfileInfo profileInfo = minfo.get(position);
        holder.username.setText(profileInfo.getUserName());
        holder.phoneNumber.setText(profileInfo.getPhoneNumber());
        holder.id.setText(profileInfo.getUserId());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, MessageLayout.class);
                intent.putExtra(USER_ID, profileInfo.getUserId());
                Log.d("UserID:", profileInfo.getUserId());
                context.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {
        return minfo.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {

        TextView username;
        TextView phoneNumber, id;
        CircleImageView profileImage;
        RelativeLayout relativeLayout;

        ViewHolder(@NonNull View itemView) {
            super(itemView);
            username = itemView.findViewById(R.id.user);
            phoneNumber = itemView.findViewById(R.id.phone);
            id = itemView.findViewById(R.id.id);
            profileImage = itemView.findViewById(R.id.circleProfileImage);
            relativeLayout = itemView.findViewById(R.id.relativeLayout);

        }
    }
}

MessageLayout.class

public class MessageLayout extends AppCompatActivity {

    FirebaseUser currentUser;
    DatabaseReference db, chatDb;
    EditText message;
    ImageButton sendMessage;
    TextView username;
    CircleImageView profileImage;
    String recieverId, messageText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_message_layout);

        message = findViewById(R.id.editTextMessage);
        sendMessage = findViewById(R.id.sendMessage);
        username = findViewById(R.id.displayUsername);
        profileImage = findViewById(R.id.circledp);
        currentUser = FirebaseAuth.getInstance().getCurrentUser();


        Intent intent = getIntent();
        recieverId = intent.getStringExtra(UsersAdapter.USER_ID);

        db = FirebaseDatabase.getInstance().getReference().child("UserInfo").child(recieverId);
        chatDb = FirebaseDatabase.getInstance().getReference().child("Chats");
        db.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                ProfileInfo info = dataSnapshot.getValue(ProfileInfo.class);

                username.setText(info.getUserName());
                Glide.with(MessageLayout.this).load(info.getProfilePhotoUrl()).into(profileImage);
            }

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

            }
        });

    }

【问题讨论】:

  • 您在哪一行代码中获得了这些空值?
  • @AlexMamo 在 UserAdapter.class 当我尝试通过输入发送值时

标签: java android android-studio debugging firebase-realtime-database


【解决方案1】:

问题出在您的构造函数中。似乎您的数据快照正在使用您的 ProfileInfo(String userName, String phoneNumber) 构造函数进行投射。

您可以这样做:确保模型类中只有两个构造函数:常规的无参数构造函数,然后是成熟的构造函数。像这样的:

public ProfileInfo() {}

public ProfileInfo(String userName, String profilePhotoUrl, String phoneNumber, String userId) {
    this.userName = userName;
    this.profilePhotoUrl = profilePhotoUrl;
    this.phoneNumber = phoneNumber;
    this.userId = userId;
}

然后,运行您的代码并重试。

【讨论】:

  • 感谢您的建议。但是我想知道如果我必须使用带有用户名和电话号码的构造函数该怎么办?我应该将其他值作为 null 传递吗?
  • 将其他值作为 null 传递很酷,但是如果您对任何 null 变量执行任何 get() 操作,您的应用程序就有崩溃的风险。更好的方法是在它们为空时为其设置默认值。例如,“NOT_SET_YET”。我确信应该有比这更好的方法,但这是我现在能想到的最好的方法......另外,它保证可以工作。
  • 感谢您的建议。我一定会尝试的。
【解决方案2】:

在你的模型类中,应该有一个参数化构造函数。尝试注释第二个参数化构造函数,看看是否有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 2016-08-10
    • 1970-01-01
    • 2016-09-03
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多