我有一项活动,我需要实现一个基本的mm :: ss计时器。下面是我为它编写的代码。但问题是,当我按下模拟器中的后退按钮并再次单击应用程序时,值的变化会更快。看起来onCreate再次被调用。我该如何纠正这个? 我已经尝试创建一个布尔变量,并在第一次调用任务时将其设置为true。我只在值为false时调用startPeriodidUpdates()。但onCreate再次使用false值创建变量。
public class GraphicsActivity extends Activity {
static int seconds = 0;
static int minutes = 0;
public static String time_elapsed;
public static boolean clearView = true;
Handler myhandler = new Handler();
public static String min,sec;
public static boolean running = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startPeriodicUpdates();
}
public void onResume(){
super.onResume();
}
public void onPause() {
super.onPause();
}
public void onStop(){
super.onStop();
}
public void startPeriodicUpdates()
{
periodicCall();
}
public void stopPeriodicUpdates(){
myhandler.removeCallbacksAndMessages(myhandler);
}
public void periodicCall()
{
seconds++;
if(seconds ==60)
{
seconds=0;
minutes++;
if(minutes==60)
{
seconds=0;
minutes=0;
}
}
// left-padding zeros to the minutes and seconds values
min = String.format("%02d",minutes);
sec = String.format("%02d",seconds);
time_elapsed = min + ":" + sec;
time_elapsed = min + ":" + sec + "";
myhandler.postDelayed(new Runnable(){
public void run(){
periodicCall();
}
},1000);
}
答案 0 :(得分:1)
也许这会有所帮助:执行定期任务的正确方法是在OnResume
中注册处理程序并在OnPause
中取消注册。 (您可以取消注册其他地方,但OnPause很重要)
答案 1 :(得分:1)
如果您使用服务来实现计时器,我认为会更好。即使您按下按钮,服务也会继续运行。
Here你可以看到我刚才问过的一个问题。您可以使用服务查看自定义天文台的实现。
您想要接收计时器值的活动只需要有一个BroadcastReceiver,如:
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mMilis = intent.getLongExtra("milis",0);
String time = intent.getStringExtra("tiempo");
// Do Something with the time
}
};
答案 2 :(得分:0)
这可能不是上述问题的解决方案,但如果您只想更新视图并在给定时间内计算,请查看Chronometer。如果您想倒计时并更新视图,可以使用CountDownTimer
执行此操作答案 3 :(得分:0)
您可以使用共享首选项仅使用此方法一次。
//第一次传递真实
protected void storeSharedPrefs(Boolean value) {
/*
* Storing in Shared Preferences
*/
editor.putString("first", value);
editor.commit(); //Commiting changes
}
通过检查SharedPreferences
检查每个应用程序是否已加载,是否第一次和配置详细信息已正确输入private boolean first_time_check() {
/*
* Checking Shared Preferences if the user had pressed
* */
Boolean first = uPreferences.getString("first", false);
return first;
}