2016-08-30 65 views
3

请帮忙,我有一个需要暂停和恢复的方法中的倒数计时器。 我设法通过使用onPause中的.cancel()来暂停计时器,但是我无法让它正常重启。 我有两种情况: 情景1-暂停,但重新启动后,即使初始计时器被取消,似乎也会重新启动两个倒计时计时器。如何在Activity中正确设置CountDownTimer

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(); 
} 

第二种情况只是系统崩溃:

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(); 
} 

我用Google搜索,似乎无法找到一个有效的解决方案。 请帮忙,银河商店拒绝上传我的apk,除非此功能正常。

回答

2

事情是,CountDownTimer是一个相对有限的类。它只有两种方法,start()cancel(),以及两个回调,onTick()onFinish()。内置没有暂停/恢复功能。

我使用TextView设置了一个非常基本的Activity,以便可视化CountDownTimer的行为,并且它像您想要的那样工作 - 在离开活动时暂停,在您返回时恢复。我已经张贴在这里的简单代码:

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对象以外的时间。

+0

感谢它的工作原理,但我现在遇到timeRemaining变量的问题,它应该重置为60000时按playAgain。我尝试在playAgain方法中重置它,但它不起作用。我已经在简历中重置了它,但是它在60秒的时间内恢复,而不是剩下的时间。每次我现在玩的时候都是从timeRemain = l开始的。 –

+0

我甚至尝试在onFinnish中重置它 –

+0

我甚至尝试创建一个方法调用timeRemain –