comment utiliser postDelayed () correctement dans le studio android?
J'ai un countDownTimer et si l'utilisateur ne touche pas le gameButton au sein de la 12ème seconde je veux le gameOver méthode appelée. problème je obtenir jeu funtion appelé instamtly quand countDownTimer est de 12 ou de la minuterie continue à s'écouler. Donc, je suis en train d'utiliser le postDelayed() méthode pour donner à l'utilisateur une seule seconde pour appuyer sur le bouton et laissez le countDownTimer de continuer, mais que mon code est bon maintenant, le jeu s'arrête sur 12 peu importe.
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();
}
}
}
source d'informationauteur Ryder Thacker
Vous devez vous connecter pour publier un commentaire.
Vous êtes presque à l'aide de
postDelayed(Runnable, long)
correctement, mais tout simplement pas assez. Prenons un oeil à votre Exécutable.Lorsque nous appelons
r.run();
la première chose qu'il va faire est de dire à votrehandler
pour exécuter le même Exécutable après 1000 millisecondes, puis d'appelergameOver()
. Ce que ce sera effectivement le résultat en est votregameOver()
méthode appelée deux fois: une fois tout de suite, et un deuxième temps une fois que le Gestionnaire est en fait en attente 1000 millisecondes.Au lieu de cela, vous devriez changer votre Exécutable:
Et de l'appeler comme ceci:
Espère que cette aide.