[英]Timer.schedule runs once even with period
我是一名學生,我試圖為我的一個模塊的微型項目創建一個應用程序,並且試圖創建一個每隔幾秒鍾就從服務器獲取數據的應用程序,以便對其進行更新 。 我嘗試使用java timer和timerTask重復運行代碼,但是該程序在執行計時器后僅運行一次,並且get按鈕無法按預期工作(假定立即獲取數據)。 Android模擬器
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.