簡體   English   中英

即使周期,Timer.schedule也運行一次

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM