studio new developers delaymillis android handler android-handler postdelayed

new - ¿Cómo usar postDelayed() correctamente en Android Studio?



new handler() postdelayed new runnable() (1)

Casi estás usando postDelayed(Runnable, long) correctamente, pero no del todo. Echemos un vistazo a su Runnable.

final Runnable r = new Runnable() { public void run() { handler.postDelayed(this, 1000); gameOver(); } };

Cuando llamamos r.run(); Lo primero que hará es decirle a su handler que ejecute el mismo Runnable después de 1000 milisegundos, y luego llamar a gameOver() . Lo que realmente resultará es que tu método gameOver() sea ​​llamado dos veces: una vez de inmediato, y una segunda vez una vez que el Handler termina de esperar 1000 milisegundos.

En su lugar, debes cambiar tu Runnable a esto:

final Runnable r = new Runnable() { public void run() { gameOver(); } };

Y llámalo así:

handler.postDelayed(r, 1000);

Espero que esto ayude.

Tengo un countDownTimer y si el usuario no golpea el botón GameButton en el segundo 12 segundo, quiero que se llame al método gameOver. problema O bien, la función del juego se llama instantáneamente cuando countDownTimer es 12 o el temporizador sigue contando. Así que estoy tratando de usar el método postDelayed () para darle al usuario un segundo completo para presionar el botón y dejar que el temporizador CountDown continúe, pero como mi código está en este momento, el juego se detiene en 12 sin importar.

import android.app.Activity; import android.os.CountDownTimer; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class GameScreen extends Activity { private TextView time; private Button start; private Button cancel; private Button gameButton; private CountDownTimer countDownTimer; public static int count = 0; public static int countFail = 0; final Handler handler = new Handler(); final Runnable r = new Runnable() { public void run() { handler.postDelayed(this, 1000); gameOver(); } }; private View.OnClickListener btnClickListener = new View.OnClickListener(){ @Override public void onClick(View v) { switch(v.getId()){ case R.id.start_ID : start(); break; case R.id.cancel : cancel(); break; case R.id.gameButton_ID : gameButton(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_game_screen); start = (Button) findViewById(R.id.start_ID); start.setOnClickListener(btnClickListener); cancel = (Button) findViewById(R.id.cancel); cancel.setOnClickListener(btnClickListener); time = (TextView) findViewById(R.id.time); gameButton = (Button) findViewById(R.id.gameButton_ID); gameButton.setOnClickListener(btnClickListener); } public void start(){ time.setText("16"); //this doesnt work and makes app crash when you hit start button countDownTimer = new CountDownTimer(16 * 1000, 1000) { @Override public void onTick(long millsUntilFinished){ time.setText("" + millsUntilFinished / 1000); //turns textview string to int int foo = Integer.parseInt(time.getText().toString()); if(time.getText().equals("12")){ r.run(); } } public void onFinish() { time.setText("Done !"); } }; countDownTimer.start(); } private void cancel(){ if(countDownTimer != null){ countDownTimer.cancel(); countDownTimer = null; } } private void gameOver(){ Toast.makeText(getApplicationContext(), "You scored " + count, Toast.LENGTH_SHORT).show(); count = 0; countFail = 0; cancel(); } private void gameButton(){ int foo = Integer.parseInt(time.getText().toString()); if(foo % 2 == 0 ) { Toast.makeText(getApplicationContext(), "PASS", Toast.LENGTH_SHORT).show(); handler.removeCallbacks(r); ++count; } else{ gameOver(); } } }