Запретить активность запускать старый экземпляр - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь отобразить контакты для сохранения в группе пользователей в базе данных FirebaseDatabase.

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

Вот пример: MainActivity вызывает GroupActivity; GroupActivity вызывает NewUserActivity и NewUserActivity возвращается к MainActivity после нажатия кнопки.

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

Вот Logcat и краткое объяснение: Первый раунд. Приложение запускается нормально На первом экране показаны названия групп

debinf mainpage: onStart
debinf mainpage: onResume
debinf mainpage: onPause
debinf mainpage: onResume

Вот первый щелчок по элементу в RecyclerView. Здесь показаны пользователи в группе. Внизу экрана есть поплавковая кнопка Action

debinf mainpage: onPause
debinf groupactivity: onStart
debinf groupactivity: onResume
debinf mainpage: onStop

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

debinf groupactivity: onPause
debinf newuser: onCreate
debinf groupact: passed intentextrasA
debinf groupact: passed intentextrasB
debinf newuser: onStart
debinf newuser: onResume
debinf newuser: Load peopleA to ContactAdded
debinf newuser: Load peopleB to ContactAdded
debinf newuser: Load peopleC to ContactAdded
debinf groupactivity: onStop
debinf groupactivity: onDestroy

Здесь показаны загруженные контакты в верхней части RecyclerView. и список контактов моего устройства в нижней части RecyclerView. Действие добавления и удаления контактов к временному пути здесь не показывается упростить пример. После выбора, кто входит, а кто нет в группе, Я нажимаю кнопку, чтобы завершить и сохранить контакты в групповом пути в базе данных FirebaseDatabase.

debinf newuser: button pressed
debinf newuser: Added peopleA inside button
debinf newuser: Added peopleB inside button
debinf newuser: Finish inside the button
debinf newuser: onPause
debinf mainpage: onRestart
debinf mainpage: onStart
debinf mainpage: onResume
debinf newuser: onStop
debinf newuser: onDestroy

Как и ожидалось, MainActivity называется после того, как я нажимаю кнопку в NewUserActivity. Пока все хорошо

Второй раунд. Теперь давайте сделаем тот же процесс снова. Я щелкнул по имени группы, чтобы перейти к GroupActivity.

debinf mainpage: onPause
debinf groupactivity: onStart
debinf groupactivity: onResume
debinf mainpage: onStop

Теперь я нажал кнопку floatAction.

debinf groupactivity: onPause
debinf newuser: onCreate
debinf groupact: passed by intentextrasA
debinf groupact: passed by intentextrasB
debinf newuser: onStart
debinf newuser: onResume
debinf newuser: Load peopleA to ContactAdded
debinf newuser: Load peopleB to ContactAdded
debinf newuser: button pressed
debinf newuser: Added peopleA inside button
debinf newuser: Added peopleB inside button
debinf newuser: Finish inside the button
debinf groupactivity: onStop
debinf groupactivity: onDestroy

Как видно, кнопка была нажата сама по себе.

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

Я думаю, что это связано с сохраненным экземпляром.

Что мне нужно сделать, чтобы NewUserActivity работало само по себе? потому что это вызывает беспорядок с процессом добавления и удаления контакты. Кроме того, я удаляю все свои контакты из группы.

Заранее спасибо!

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Нажмите прослушиватель для адаптера MainActivity

holder.mLayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent groupActivity = new  Intent(mContext,GroupActivity.class);
        groupActivity.putExtra("groupName",groupList.get(position).getGroupId());
        groupActivity.putExtra("groupPushKey",groupList.get(position).getGroupKey());
        // Because we are in Adapter, the Adapter does not know what context is
        // so the activity is started from the mContext
        mContext.startActivity(groupActivity);

    }
});

FloatActionButton в группе Активность

AddContact = (FloatingActionButton) findViewById(R.id.addContactInGroup);
AddContact.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        Intent newUserToGroup = new Intent(getApplicationContext(),NewUserToGroupActivity.class);
        newUserToGroup.putExtra("groupName",groupNameIntent);
        newUserToGroup.putExtra("groupPushKey",groupKeyIntent);
        startActivity(newUserToGroup);
        finish();

    }
});

Нажмите прослушиватель для кнопки в NewUserActivity

mUpdateGroupBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        updateGroupUsers();
    }
});

Где:

private void updateGroupUsers () {

RootRef.child("ContactAdded").child(currentUser).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            Log.i("debinf newuser", "button pressed");

            Map<String, Object> updateGroupUsersMap = new HashMap<>();

            for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {

                Log.i("debinf newuser", "Added people inside button : " + childSnapshot.getKey());
                updateGroupUsersMap.put(childSnapshot.getKey(),"");

            }

            FirebaseDatabase.getInstance().getReference().child("Group").child(currentUser).child(groupKeyIntent).child(groupNameIntent).setValue(updateGroupUsersMap);

            FirebaseDatabase.getInstance().getReference().child("ContactAdded").child(currentUser).removeValue();

            Log.i("debinf newuser","Finish inside the button");
            finish();

        }
    }

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

    }
});

}

1 Ответ

0 голосов
/ 13 января 2019

Что-то не так в том, что вы делаете в updateGroupUsers.

Это вызывается, когда пользователь нажимает кнопку, поэтому вам нужно немедленно выполнить какое-то задание, вместо этого вы регистрируете ValueEventListener и ждете, пока не произойдет onDataChange, и только тогда вы выполните это действие.

Очевидно, что, поскольку вы никогда не удаляете этого добавленного прослушивателя, слушатель по-прежнему ожидает изменения данных, и всякий раз, когда обнаруживается новое изменение данных, он снова выполняет действие, ложно печатая «нажатие кнопки» в журнале, даже если кнопка не был нажат.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...