Eu estou tentando criar um aplicativo de mensagens. Até agora o meu código funcionou bem, mas agora eu estou enfrentando um erro ao enviar mensagens para o usuário quando tento enviar uma mensagem de um usuário para outro minhas mensagens ficar atualizado no banco de dados em tempo real, mas ele não mostra no RecyclerView
. Mas quando eu já não tem nenhuma mensagem em meu banco de dados Ele funciona muito bem, mas depois de clicar em enviar meu aplicativo trava.
Ele mostra erro na seguinte linha
if (chat.getReciver().equals(myid) && chat.getSender().equals(userid)||
chat.getReciver().equals(userid)&&chat.getSender().equals(myid)){
mChat.add(chat);
}
E o erro que eu recebo na janela logcat é
Java.lang.NullPointerException: Tentativa de chamar o método virtual 'java.lang.String.equals booleanos (java.lang.Object)' em uma referência nula objeto em com.shivam.chatapp2.MessageActivity $ 4.onDataChange (MessageActivity.java:148 )
Meu código completo
MessageActivity.java
public class MessageActivity extends AppCompatActivity {
CircleImageView profile_image;
TextView user_name;
FirebaseFirestore fstore;
FirebaseAuth fAuth;
FirebaseUser fuser;
DatabaseReference reference;
Toolbar toolbar;
ImageButton imageButton;
EditText textsend;
String userID;
MessageAdapter messageAdapter;
List<Chat> mChat;
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
fAuth=FirebaseAuth.getInstance();
fstore=FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
profile_image=findViewById(R.id.profile_image);
user_name=findViewById(R.id.username);
imageButton=findViewById(R.id.btn_send);
textsend=findViewById(R.id.text_send);
recyclerView=findViewById(R.id.recycler_view2);
recyclerView.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager= new LinearLayoutManager(getApplicationContext());
linearLayoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(linearLayoutManager);
toolbar=findViewById(R.id.myToolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle("");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
Intent intent=getIntent();
fuser=FirebaseAuth.getInstance().getCurrentUser();
String userid=intent.getStringExtra("userid");
String username= intent.getStringExtra("UserName");
reference = FirebaseDatabase.getInstance().getReference("Users").child(userid);
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
user_name.setText(user.getFirst());
readMessages(fuser.getUid(), userid);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg=textsend.getText().toString();
if (!msg.equals("")){
sendMessage(fuser.getUid(),userid,msg);
}
else {
Toast.makeText(MessageActivity.this,"Empty messages cant be send",Toast.LENGTH_SHORT).show();
}
}
});
}
private void sendMessage(String sender, final String receiver, String message) {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("sender", sender);
hashMap.put("receiver", receiver);
hashMap.put("message", message);
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
reference.child("Chats").push().setValue(hashMap);
}
private void readMessages(String myid,String userid){
mChat=new ArrayList<>();
reference=FirebaseDatabase.getInstance().getReference("Chats");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
mChat.clear();
for (DataSnapshot snapshot:dataSnapshot.getChildren()) {
Chat chat=snapshot.getValue(Chat.class);
assert chat != null;
if (chat.getReciver().equals(myid) && chat.getSender().equals(userid)||
chat.getReciver().equals(userid)&&chat.getSender().equals(myid)){
mChat.add(chat);
}
messageAdapter=new MessageAdapter(MessageActivity.this,mChat);
recyclerView.setAdapter(messageAdapter);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
MessageAdapter.java
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.ViewHolder> {
public static final int MSG_TYPE_LEFT = 0;
public static final int MSG_TYPE_RIGHT = 1;
private Context mContext;
private List<Chat> mChat;
FirebaseUser fuser;
public MessageAdapter() {
}
public MessageAdapter(Context mContext, List<Chat> mChat) {
this.mContext = mContext;
this.mChat = mChat;
}
@NonNull
@Override
public MessageAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == MSG_TYPE_RIGHT) {
View view = LayoutInflater.from(mContext).inflate(R.layout.chat_item_right, parent, false);
return new MessageAdapter.ViewHolder(view);
}
else {
View view = LayoutInflater.from(mContext).inflate(R.layout.chat_item_left, parent, false);
return new MessageAdapter.ViewHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull MessageAdapter.ViewHolder holder, int position) {
Chat chat=mChat.get(position);
holder.show_message.setText(chat.getMessage());
}
@Override
public int getItemCount() {
return mChat.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView show_message;
//public ImageView profile_image;
public ViewHolder(@NonNull View itemView) {
super(itemView);
show_message=itemView.findViewById(R.id.username);
//profile_image=itemView.findViewById(R.id.profile_image);
}
}
@Override
public int getItemViewType(int position) {
fuser= FirebaseAuth.getInstance().getCurrentUser();
if (mChat.get(position).getSender().equals(fuser.getUid())){
return MSG_TYPE_RIGHT;
}
else {
return MSG_TYPE_LEFT;
}
}
}
Chat.java
public class Chat {
private String sender;
private String reciver;
private String message;
public Chat(String sender, String reciver, String message) {
this.sender = sender;
this.reciver = reciver;
this.message = message;
}
public Chat() {
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getReciver() {
return reciver;
}
public void setReciver(String reciver) {
this.reciver = reciver;
}
public String getMessage() {
return message;
}
O problema no seu código é a reciver
propriedade em sua Chat
classe. Esta propriedade deve ser nomeado receiver
, uma vez que está na sua base de dados:
Então, para resolver isso, altere a sua Chat
classe para:
public class Chat {
private String sender;
private String receiver;
private String message;
public Chat(String sender, String receiver, String message) {
this.sender = sender;
this.receiver = receiver;
this.message = message;
}
public Chat() {
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public String getMessage() {
return message;
}
}