gpt4 book ai didi

java - Timer.schedule 即使有句点也运行一次

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:11 25 4
gpt4 key购买 nike

我是一名学生,试图为我的一个模块的迷你项目创建一个应用程序,并且我正在尝试创建一个每隔几秒从服务器获取数据的应用程序,以便它更新。我尝试使用java计时器和timerTask重复运行代码,但程序只运行一次,并且在实现计时器后,获取按钮无法按预期工作(假设立即获取数据)。 Android Emulator

    public class MainActivity extends AppCompatActivity implements OnClickListener{

private Button speed;
private TextView result;
Timer timer;
TimerTask timerTask;
private TextView sSpeed;
final StringBuilder builder = new StringBuilder();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
result = (TextView) findViewById(R.id.result);
sSpeed = (TextView) findViewById(R.id.sSpeed);
speed = (Button) findViewById(R.id.get_button);
speed.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
getWebsite();
}
});
View aboutButton = this.findViewById(R.id.about_button);
aboutButton.setOnClickListener(this);
View exitButton = this.findViewById(R.id.exit_button);
exitButton.setOnClickListener(this);
}

public void onClick(View v) {
switch (v.getId()){
case R.id.get_button:
getWebsite();
break;
case R.id.about_button:
Intent i = new Intent(this, About.class);
startActivity(i);
break;
case R.id.exit_button:
finish();
break;
}
}

private void getWebsite(){
new Thread(new Runnable() {
@Override
public void run() {


try{
Document doc = Jsoup.connect("http://10.0.2.2:8080/Start_Stop_buttons_UTF8.html").get();
// Elements element = doc.getElementsByTag("p");
Elements element = doc.select("p");
//String title = doc.title();
builder.append(title).append("\n");
for (Element tag : element){
builder.append("\n\n").append(tag.text());
}

}catch(IOException e){
//e.printStackTrace();
builder.append("Error : ").append(e.getMessage()).append("\n");
}

runOnUiThread(new Runnable() {
@Override
public void run() {
String a = builder.toString(); // parse data from html into new string
a = a.substring(a.indexOf(":")+1, a.indexOf("Control")).trim();//trim string content
String b = builder.toString();
b = b.substring(11,b.indexOf(":")+1).trim();

double speed = Double.parseDouble(a);//convert string into double
if (speed<1000)
Log.i("HTML text","too slow");
else if((speed> 1500))Log.i("HTML text","too fast!");

result.setText(a);
sSpeed.setText(b);
}
});
}

}).start();

}

protected void onResume() {
super.onResume();
startTimer();
}

public void startTimer(){
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
getWebsite();

}
};
timer.schedule(timerTask,1500,3000);
}

public void stopTimer(){
if(timer != null){
timer.cancel();
timer.purge();
}
}

}

我是否正确实现了计时器以重复运行 getwebsite() 并能够在单击 get-button 时获得即时更新,就像它应该有的那样?或者有没有更好的方法使用不同的方法来实现这些功能?

最佳答案

您永远不会在 ClickListener 中调用 startTimer 方法。您对 getWebsite 进行一次调用。将您的调用更改为 startTimer

 speed.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
startTimer();
}
});

您可能还想在开始新计时器之前检查计时器是否已经在运行。为此,请在 stopTimer 方法上分配一个 null 值,例如

public void stopTimer(){
if(timer != null){
timer.cancel();
timer.purge();
timer = null;
}
}

你的startTimer看起来像这样

public void startTimer(){
if(timer != null) return; // don't start multiple timers
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
getWebsite();

}
};
timer.schedule(timerTask,1500,3000);
}

关于java - Timer.schedule 即使有句点也运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45530186/

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