В настоящее время я пытаюсь написать приложение для обмена сообщениями и обнаружил ошибку, с которой я застрял в течение двух недель и просто не могу ничего найти.
Приложение работает следующим образом: Когда пользователь связывается, статус обоих пользователей должен быть установлен как «заблокированный», чтобы никто другой не мог связаться с ним.Вот как я реализовал это в программе:
кнопка отправки:
openNewChatButton = (Button) findViewById(R.id.mainSendButton);
openNewChatButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String checkText = sendMainMessage.getText().toString();
if (checkText.isEmpty()) {
Toast.makeText(MainActivity.this, "Bitte verfasse vorher eine Nachricht.", Toast.LENGTH_SHORT).show();
} else {
sendMessageToUser();
}
}
});
Создание сообщения и его отправка:
public void sendMessageToUser() {
mUsersDatabaseForRandomChatUser.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
key = sampleUserID;
if (current_uid.equals(key) || key == null || key == "") {
Toast.makeText(MainActivity.this, "Keinen passenden Chatpartner gefunden!", Toast.LENGTH_SHORT).show();
} else {
Intent newMessageIntent = new Intent(MainActivity.this, ChatActivity.class);
newMessageIntent.putExtra("chatuser_id", key);
newMessageIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
newMessageIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
sendChatMessage();
finish();
setYouChatID();
changeStateOfUserToBlocked();
startActivity(newMessageIntent);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void sendChatMessage() {
String message = sendMainMessage.getText().toString();
if (!TextUtils.isEmpty(message)) {
String current_user_ref = "messages/" + current_uid + "/" + key;
String chat_user_ref = "messages/" + key + "/" + current_uid;
DatabaseReference user_message_push = mRootReference.child("Messages").child(current_uid).child(key).push();
String push_id = user_message_push.getKey();
Map messageMap = new HashMap();
messageMap.put("message", message);
messageMap.put("seen", false);
messageMap.put("type", "text");
messageMap.put("time", ServerValue.TIMESTAMP);
messageMap.put("from", current_uid);
sendMainMessage.setText("");
Map messageUserMap = new HashMap();
messageUserMap.put(current_user_ref + "/" + push_id, messageMap);
messageUserMap.put(chat_user_ref + "/" + push_id, messageMap);
mRootReference.updateChildren(messageUserMap, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError != null)
Log.d("CHAT_LOG", databaseError.getMessage().toString());
}
});
}
}
Изменение статуса пользователя и установка текущего чата:
private void setYouChatID() {
DatabaseReference youChatID = mRootReference.child("Users").child(mAuth.getCurrentUser().getUid()).child("youchatid");
youChatID.setValue(key);
DatabaseReference youChatIDChatUser = mRootReference.child("Users").child(key).child("youchatid");
youChatIDChatUser.setValue(current_uid);
}
private void changeStateOfUserToBlocked() {
DatabaseReference stateDatabaseChatUser = mRootReference.child("Users").child(key).child("status");
stateDatabaseChatUser.setValue("blocked");
DatabaseReference stateDatabaseUser = mRootReference.child("Users").child(mAuth.getCurrentUser().getUid()).child("status");
stateDatabaseUser.setValue("blocked");
}
Здесь все работает отлично.
Теперь, когда чат закрыт, статус обоих пользователей должен быть возвращен в «свободный», а текущий chatPartner (youchatid) должен быть установлен в «default».
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAuth = FirebaseAuth.getInstance();
mCurrentUserId = mAuth.getCurrentUser().getUid();
mRootReference = FirebaseDatabase.getInstance().getReference();
mChatUserId = getIntent().getStringExtra("giveUserChatID");
setContentView(R.layout.activity_securty_pop_up);
bestaetigenButton = findViewById(R.id.bestaetigenButton);
bestaetigenButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecurtyPopUpActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
finish();
startActivity(intent);
changeStateOfUserToFree();
removeYouChatID();
}
});
}
public void changeStateOfUserToFree() {
DatabaseReference stateDatabaseChatUser = mRootReference.child("Users").child(mChatUserId).child("status");
stateDatabaseChatUser.setValue("free");
DatabaseReference stateDatabaseUser = mRootReference.child("Users").child(mAuth.getCurrentUser().getUid()).child("status");
stateDatabaseUser.setValue("free");
}
public void removeYouChatID() {
DatabaseReference youChatID = mRootReference.child("Users").child(mAuth.getCurrentUser().getUid()).child("youchatid");
youChatID.setValue("default");
DatabaseReference youChatIDChatUser = mRootReference.child("Users").child(mChatUserId).child("youchatid");
youChatIDChatUser.setValue("default");
}
Именно здесь и начинается проблема!
Похоже, что в этот момент программа попала в цикл.Оба атрибута ненадолго меняются, но возвращаются к старому значению, и действие открывается снова.
Однако, если я закрою все задачи на своем смартфоне (включая мое приложение) и попробую то же самое снова, это будет работать без проблем.Однако после первого раза он не работает снова, и цикл начинается заново, как видно из видео.
Поскольку это не так легко понять, я добавил сюда видео: https://www.youtube.com/watch?v=fNgjYbgB44w
Я более чем отчаялся и просто не могу найти решение этой проблемы?Может быть, у одного из вас будет идея.