Цикл при попытке изменить значение в базе данных Firebase на Android - PullRequest
0 голосов
/ 15 мая 2018

В настоящее время я пытаюсь написать приложение для обмена сообщениями и обнаружил ошибку, с которой я застрял в течение двух недель и просто не могу ничего найти.

Приложение работает следующим образом: Когда пользователь связывается, статус обоих пользователей должен быть установлен как «заблокированный», чтобы никто другой не мог связаться с ним.Вот как я реализовал это в программе:

кнопка отправки:

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");
}

Здесь все работает отлично.

enter image description here

Теперь, когда чат закрыт, статус обоих пользователей должен быть возвращен в «свободный», а текущий 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

Я более чем отчаялся и просто не могу найти решение этой проблемы?Может быть, у одного из вас будет идея.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Всегда используйте addListenerForSingleValueEvent (), если какая-либо модификация базы данных или какая-либо функция должна выполняться внутри метода dataChange

0 голосов
/ 19 мая 2018

Не могу поверить, что решение было таким «простым». Все время я думал, что ValueEventListeners в методе setYouChatID() были неправильными. Однако в методе sendMessageToUser() вместо addListenerForSingleValueEvent() все еще было addValueEventListener(). После того, как я это исправил, проблема исчезла!

...