Как подождать конца операций и только потом усыпить поток?

94
09 января 2021, 06:30

У меня есть код

 public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    Log.v(text, "" + dataSnapshot);
    if (!dataSnapshot.exists()) {
      Toast toast = Toast.makeText(getApplicationContext(),
              "QRCode неверен! Попробуйте ещё раз", Toast.LENGTH_SHORT);
      toast.show();
      AlertDialog.Builder builder = new AlertDialog.Builder(DecoderActivity.this);
      builder.setTitle("Информация")
              .setMessage("QR Code уже считан или неверен")
              .setCancelable(false)
              .setNegativeButton("ОК",
                      (dialog, id) -> dialog.cancel());
      AlertDialog alert = builder.create();
      alert.show();


    }
    else {
      long qrCoinsAmount = dataSnapshot.getValue(Long.class);
      DatabaseReference coinsAmountRef = rootRef.child("users").child(getUid()).child("coinsAmount");
      ValueEventListener valueEventListener = new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
          long coinsAmount = dataSnapshot.getValue(Long.class);
          coinsAmountRef.getRef().setValue(coinsAmount + qrCoinsAmount);
          coinsUidRef.removeValue();
          AlertDialog.Builder builder = new AlertDialog.Builder(DecoderActivity.this);
          builder.setTitle("Информация")
                  .setMessage("QR Code успешно считан")
                  .setCancelable(false)
                  .setNegativeButton("ОК",
                          (dialog, id) -> dialog.cancel());
          AlertDialog alert = builder.create();
          alert.show();
          try {
            Thread.sleep(10000);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }

        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
        }
      };
      coinsAmountRef.addListenerForSingleValueEvent(valueEventListener);

    }

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

};
coinsUidRef.addListenerForSingleValueEvent(valueEventListener);
try {
  Thread.sleep(10000);
} catch (InterruptedException e) {
  e.printStackTrace();
}
Intent intent = new Intent(this,MenuActivity.class);
startActivity(intent);

}

По задумке он должен показывать AlertDialog ждать 10 секунд и кидать на другую активити, но в реале как я понимаю получается, что AlertDialog еще не открылся а поток уже заснул. Как воплотить задумку?

Answer 1

Можно реализовать с использованием Handler. По прошествии установленного времени задержки, окно диалоговое окно закроется и откроется ваше активити.

final AlertDialog alert = builder.create();
alert.show();
new Handler().postDelayed(new Runnable() {
  @Override
  public void run() {
      if (alert.isShowing()){
          alert.dismiss();
          Intent intent = new Intent(this, MenuActivity.class);
          startActivity(intent);
      }
  }
}, 99999); // время задержки
READ ALSO
Про return более подробно?

Про return более подробно?

Начал изучать программирование и начал с языка Java и столкнулся с трудностью, поэтому прошу помощи

94
Не запускается проект GWT в Intellij Idea

Не запускается проект GWT в Intellij Idea

При запуске пишет ошибку:

125
HTML. При нажатии на кнопку всплывает форма

HTML. При нажатии на кнопку всплывает форма

Ребят, очень нужноКак сделать так, чтобы при нажатии на кнопку всплывала форма с с полями, куда пользователь мог бы внести данные и тем самым...

118
Uncaught TypeError: Cannot read property 'style' of null

Uncaught TypeError: Cannot read property 'style' of null

Здраствуйте, у меня появилась проблема - Uncaught TypeError: Cannot read property 'style' of null

115