助けてください、私は一時停止して再開する必要があるメソッド内にカウントダウンタイマーがあります。onPauseで.cancel()を使用してタイマーを一時停止できましたが、正しく再起動できません。2つのシナリオがあります。シナリオ1-一時停止しますが、再起動すると、最初のタイマーがキャンセルされた場合でも、両方のカウントダウンタイマーが再起動するようです。
public void playAgain (View view) {
score = 0;
numberOfQuestions = 0;
timerTextView.setText("60s");
pointsTextView.setText("0/0");
resultTextView.setText("");
playAgainButton.setVisibility(View.INVISIBLE);
returnToMenu.setVisibility(View.INVISIBLE);
resultDisplayTextView.setVisibility(View.INVISIBLE);
countDownText.setVisibility(View.VISIBLE);
button0.setVisibility(View.INVISIBLE);
button1.setVisibility(View.INVISIBLE);
button2.setVisibility(View.INVISIBLE);
button3.setVisibility(View.INVISIBLE);
sumTextView.setVisibility(View.INVISIBLE);
countDownTimer = new CountDownTimer(millisInFuture, countDownInterval) {
@Override
public void onTick(long timeRemain) {
millisInFuture = timeRemain;
countDownText.setText(String.valueOf(timeRemain / 1000 - 60));
if (timeRemain <= 61000) {
timerTextView.setText(String.valueOf(timeRemain / 1000) + "s");
button0.setEnabled(true);
button1.setEnabled(true);
button2.setEnabled(true);
button3.setEnabled(true);
button0.setVisibility(View.VISIBLE);
button1.setVisibility(View.VISIBLE);
button2.setVisibility(View.VISIBLE);
button3.setVisibility(View.VISIBLE);
sumTextView.setVisibility(View.VISIBLE);
countDownText.setVisibility(View.INVISIBLE);
}
}
@Override
public void onFinish() {
timerTextView.setText("0s");
if (score > 0) {
percentage = score * 100 / numberOfQuestions;
} else {
percentage = 0;
}
button0.setEnabled(false);
button1.setEnabled(false);
button2.setEnabled(false);
button3.setEnabled(false);
playAgainButton.setVisibility(View.VISIBLE);
returnToMenu.setVisibility(View.VISIBLE);
resultDisplayTextView.setVisibility(View.VISIBLE);
resultTextView.setText(" ");
}
}.start();
generateQuestion();
}
@Override
public void onPause() {
countDownTimer.cancel();
super.onPause();
}
@Override
public void onResume() {
super.onResume();
CountDownTimer countDownTimer1 = new CountDownTimer(millisInFuture, countDownInterval) {
@Override
public void onTick(long timeRemain) {
millisInFuture = timeRemain;
countDownText.setText(String.valueOf(timeRemain / 1000 - 60));
if (timeRemain <= 61000) {
timerTextView.setText(String.valueOf(timeRemain / 1000) + "s");
button0.setEnabled(true);
button1.setEnabled(true);
button2.setEnabled(true);
button3.setEnabled(true);
button0.setVisibility(View.VISIBLE);
button1.setVisibility(View.VISIBLE);
button2.setVisibility(View.VISIBLE);
button3.setVisibility(View.VISIBLE);
sumTextView.setVisibility(View.VISIBLE);
countDownText.setVisibility(View.INVISIBLE);
}
}
@Override
public void onFinish() {
timerTextView.setText("0s");
if (score > 0) {
percentage = score * 100 / numberOfQuestions;
} else {
percentage = 0;
}
button0.setEnabled(false);
button1.setEnabled(false);
button2.setEnabled(false);
button3.setEnabled(false);
playAgainButton.setVisibility(View.VISIBLE);
returnToMenu.setVisibility(View.VISIBLE);
resultDisplayTextView.setVisibility(View.VISIBLE);
resultTextView.setText(" ");
}
}.start();
}
2番目のシナリオは、システムをクラッシュさせるだけです。
public void playAgain (View view) {
score = 0;
numberOfQuestions = 0;
timerTextView.setText("60s");
pointsTextView.setText("0/0");
resultTextView.setText("");
playAgainButton.setVisibility(View.INVISIBLE);
returnToMenu.setVisibility(View.INVISIBLE);
resultDisplayTextView.setVisibility(View.INVISIBLE);
countDownText.setVisibility(View.VISIBLE);
button0.setVisibility(View.INVISIBLE);
button1.setVisibility(View.INVISIBLE);
button2.setVisibility(View.INVISIBLE);
button3.setVisibility(View.INVISIBLE);
sumTextView.setVisibility(View.INVISIBLE);
countDownTimer = new CountDownTimer(millisInFuture, countDownInterval) {
@Override
public void onTick(long timeRemain) {
millisInFuture = timeRemain;
countDownText.setText(String.valueOf(timeRemain / 1000 - 60));
if (timeRemain <= 61000) {
timerTextView.setText(String.valueOf(timeRemain / 1000) + "s");
button0.setEnabled(true);
button1.setEnabled(true);
button2.setEnabled(true);
button3.setEnabled(true);
button0.setVisibility(View.VISIBLE);
button1.setVisibility(View.VISIBLE);
button2.setVisibility(View.VISIBLE);
button3.setVisibility(View.VISIBLE);
sumTextView.setVisibility(View.VISIBLE);
countDownText.setVisibility(View.INVISIBLE);
}
}
@Override
public void onFinish() {
timerTextView.setText("0s");
if (score > 0) {
percentage = score * 100 / numberOfQuestions;
} else {
percentage = 0;
}
button0.setEnabled(false);
button1.setEnabled(false);
button2.setEnabled(false);
button3.setEnabled(false);
playAgainButton.setVisibility(View.VISIBLE);
returnToMenu.setVisibility(View.VISIBLE);
resultDisplayTextView.setVisibility(View.VISIBLE);
resultTextView.setText(" ");
}
}.start();
generateQuestion();
}
@Override
public void onPause() {
countDownTimer.cancel();
super.onPause();
}
@Override
public void onResume() {
super.onResume();
countDownTimer.start();
}
私はグーグルで検索しましたが、実用的な解決策が見つからないようです。この機能が機能しない限り、Galaxyストアは私のapkのアップロードを拒否します。
重要なのは、CountDownTimerは比較的限定されたクラスです。それだけで2つのメソッドがあり、start()
かつcancel()
、二コールバック、onTick()
およびonFinish()
。一時停止/再開機能は組み込まれていません。
CountDownTimerの動作を視覚化するために、TextViewを使用して非常に基本的なアクティビティを設定しました。これは、アクティビティを終了するときに一時停止し、戻るときに再開するなど、希望どおりに機能します。ここに簡単なコードを投稿しました:
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
private CountDownTimer mCountDownTimer;
private static final long INTERVAL = 1000L;
private long timeRemaining = 60000L;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView)findViewById(R.id.text_view);
}
@Override
protected void onResume() {
super.onResume();
mCountDownTimer = new CountDownTimer(timeRemaining, INTERVAL) {
@Override
public void onTick(long l) {
mTextView.setText(String.format(Locale.getDefault(), "%d sec.", l / 1000L));
timeRemaining = l;
}
@Override
public void onFinish() {
mTextView.setText("Done.");
}
};
mCountDownTimer.start();
}
@Override
protected void onPause() {
super.onPause();
mCountDownTimer.cancel();
}
}
このコードを実行できるかどうかを確認することから始め、次に基本的なアイデアをプロジェクトに統合します。基本的に、CountDownTimerオブジェクトの外部に残っている時間を維持する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加