gpt4 book ai didi

java - 为什么我的简单计时器应用程序每次暂停时都会变得更快?

转载 作者:行者123 更新时间:2023-12-01 12:52:45 25 4
gpt4 key购买 nike

好的,所以最初我认为问题是每次我按停止然后启动时,都会创建一个新的可运行对象,因此我们将同时运行多个可运行对象,从而每次更新计时器越来越快。但这似乎不是问题:我通过添加 boolean “运行”来更改代码,以便按开始/停止仅更改 boolean 变量。这样一来,我认为只有一个可运行程序正在运行。但当我连续多次单击开始/停止时,它仍然会变得更快。谁能告诉我问题出在哪里?

package com.example.timernew;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
Handler h=new Handler();
TextView t;
Button start, stop,reset;
boolean running;
Runnable run=new Runnable() {
@Override public void run() { updateTime(); } };;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
t = (TextView) findViewById(R.id.TextArea);
start = (Button) findViewById(R.id.start_button);
stop=(Button) findViewById(R.id.stop_button);
running=false;
h.post(run);

start.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
if(running==false){
running=true;
}
}
});
stop.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
if(running==true){
running=false;
}
}
});

}
public void updateTime() {
if(running==true){
t.setText("" + (Integer.parseInt(t.getText().toString()) +1));
h.postDelayed(run, 1000);}
}

}

最佳答案

我在开始按钮 OnClickListenter 中添加了对 updateTime() 的调用,并且在点击停止后继续计数没有任何问题。即使等待 10 秒以上,再次点击“开始”也会从上次中断的地方继续。

我确实注意到,如果我在按下停止后 1 秒内按下开始,该值会快速连续增加两倍。这是因为点击开始调用 updateTime() 并且之前发布的可运行的延迟尚未完成,因此当它完成时,它也会增加时间。

更好的选择是使用 AsyncTask:

    package com.example.timernew;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
Handler h=new Handler();
TextView t;
Button start, stop,reset;
volatile boolean running;
UpdateTimeTask mUpdateTimeTask;
int counter = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
t = (TextView) findViewById(R.id.TextArea);
start = (Button) findViewById(R.id.start_button);
stop=(Button) findViewById(R.id.stop_button);
running=false;

start.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
if (null == mUpdateTimeTask) {
mUpdateTimeTask = new UpdateTimeTask();
mUpdateTimeTask.execute();
}
}
});

stop.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
if(null != mUpdateTimeTask) {
mUpdateTimeTask.cancel(true);
mUpdateTimeTask = null;
}
}
});

}

public class UpdateTimeTask extends AsyncTask<Void, Void, Void> {

protected Void doInBackground(Void... params) {

while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
Log.e("timer app", "a problem occurred while sleeping or the task was cancelled", ie);
return null;
}
counter++;
publishProgress();
}
}

@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
t.setText(String.valueOf(counter));
}
}
}

回答有关更改 boolean 值和调用 updateTime() 的问题:

在您的原始代码中, updateTime() 仅在 onCreate() 期间在此行调用:

h.post(run);

由于您将 boolean 值设置为 false,因此它不会执行任何操作并完成运行。

现在,假设您在 start_button 单击监听器中添加对 updateTime() 的调用,并快速连续地单击开始、停止、启动。以下是正在发生的情况(假设这些事件以 100 毫秒的间隔发生):

0毫秒
单击开始将 boolean 值设置为 true,调用 updateTime()

10毫秒
updateTime() 被调用, boolean 值为 true,因此它更改文本并发布一个可在 1000ms 内运行的可运行

100毫秒单击停止将 boolean 值设置为 false

200毫秒单击开始将 boolean 值设置为 true,调用 updateTime()

210毫秒updateTime() 被调用, boolean 值为 true,因此它更改文本并发布一个可在 1000ms 内运行的可运行

1010毫秒第一个发布的 runnable 运行,发现 boolean 值为 true,更改文本并发布另一个 runnable 在 1000 毫秒内运行

1210ms第二个发布的可运行运行,发现 boolean 值为 true,更改文本,并发布另一个可运行

此时距离还不到 1.3 秒,并且计数已达到 3 秒。现在,从现在开始,文本大约每 n + .1 和 n + .2 秒就会更改一次。

关于java - 为什么我的简单计时器应用程序每次暂停时都会变得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24099987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com