14

首先,我什至无法选择要使用的方法,我现在阅读了几个小时,有人说使用“处理程序”,有人说使用“计时器”。这是我试图实现的目标:

在首选项中,有一个设置(复选框)可以启用/禁用重复作业。当该复选框被选中时,计时器应该开始工作并且线程应该每 x 秒执行一次。由于未选中复选框,计时器应该停止。

这是我的代码:

检查是否选中了复选框,如果选中'refreshAllServers' void 将被执行,它使用计时器完成工作。

boolean CheckboxPreference = prefs.getBoolean("checkboxPref", true);
                if(CheckboxPreference == true) {
                    Main main = new Main();
                    main.refreshAllServers("start");
                } else {
                    Main main = new Main();
                    main.refreshAllServers("stop");
                }

执行计时器工作的 refreshAllServers void:

public void refreshAllServers(String start) {

    if(start == "start") {

        // Start the timer which will repeatingly execute the thread

    } else {

        // stop the timer

            }

这是我执行线程的方式:(没有计时器也能很好地工作)

Thread myThread = new MyThread(-5);
                myThread.start();

我试过什么?

我尝试了任何我可以从谷歌(处理程序、计时器)看到的例子,但它们都不起作用,我设法启动了一次计时器,但停止它不起作用。我在研究中看到的最简单易懂的代码是这样的:

new java.util.Timer().schedule( 
        new java.util.TimerTask() {
            @Override
            public void run() {
                // your code here
            }
        }, 
        5000 
);
4

5 回答 5

40

只需简单地使用下面的代码片段

private final Handler handler = new Handler();
private Runnable runnable = new Runnable() {
    public void run() {
         //
         // Do the stuff
         //

         handler.postDelayed(this, 1000);
    }
};
runnable.run();

要停止它使用

handler.removeCallbacks(runnable);

应该做的伎俩。

于 2012-07-24T22:10:25.270 回答
3

使用倒数计时器。它的工作方式是它会在计时器的每个滴答声上调用一个方法,并在计时器结束时调用另一个方法。此时您可以根据需要重新启动。另外我认为您可能应该启动 AsyncTask 而不是线程。请不要尝试在 Android 中管理自己的线程。尝试如下。它像时钟一样运行。

 CountDownTimer myCountdownTimer =    new CountDownTimer(30000, 1000) {

 public void onTick(long millisUntilFinished) {
     mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     // Kick off your AsyncTask here.
 }

 public void onFinish() {
     mTextField.setText("done!");
     // the 30 seconds is up now so do make any checks you need here.
 }
 }.start();
于 2012-07-24T21:34:48.597 回答
1

我想使用 AlarmManager http://developer.android.com/reference/android/app/AlarmManager.html

如果复选框在调用方法中

AlarmManager alarmManager = (AlarmManager)SecureDocApplication.getContext()
    .getSystemService(Context.ALARM_SERVICE);
PendingIntent myService = PendingIntent.getService(context, 0, 
                new Intent(context, MyService.class), 0);

long triggerAtTime = 1000;
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, 5000 /* 5 sec*/, 
                myService);

如果复选框关闭取消警报管理器

alarmManager.cancel(myService);
于 2012-07-24T21:31:58.363 回答
1

感谢大家,我通过使用 Timer 解决了这个问题。

timer = new Timer();
timer.scheduleAtFixedRate(
    new java.util.TimerTask() {
        @Override
        public void run() {
            for (int i = 0; i < server_amount; i++) {

                servers[i] = "Updating...";
                handler.sendEmptyMessage(0);
                new MyThread(i).start();
            }
        }
    },
2000, 5000);
于 2012-07-25T17:51:06.473 回答
1

“当需要多个工作线程或需要 ThreadPoolExecutor(此类扩展)的额外灵活性或功能时,[ScheduledThreadPoolExecutor] 类比 Timer 更可取。”

每...

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html

它不只是处理程序,但可以选择每隔一段时间运行一次(每次计算完成后会有延迟)。

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


...


final int THREAD_POOL_SIZE = 10;
final int START_DELAY = 0;
final int TIME_PERIOD = 5;
final TimeUnit TIME_UNIT = TimeUnit.SECONDS;

ScheduledThreadPoolExecutor pool;

Runnable myPeriodicThread = new Runnable() {
    @Override
    public void run() {
        refreshAllServers();
    }
};


public void startTimer(){

    pool.scheduleAtFixedRate(myPeriodicThread,
            START_DELAY,
            TIME_PERIOD,
            TIME_UNIT);

}

public void stopTimer(){

    pool.shutdownNow();

}
于 2016-02-19T00:09:31.070 回答