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();

私が試したことは?

Google から確認できる例 (ハンドラー、タイマー) を試してみましたが、いずれも機能しませんでした。タイマーを 1 回開始することはできましたが、停止しても機能しませんでした。私の調査で見た最も単純でわかりやすいコードは次のとおりです。

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

CountDownTimer を使用します。それが機能する方法は、タイマーの各ティックでメソッドを呼び出し、タイマーが終了すると別のメソッドを呼び出すことです。その時点で、必要に応じて再起動できます。また、おそらくスレッドではなく 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

みんなのおかげで、タイマーを使用してこの問題を修正しました。

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

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

「[ScheduledThreadPoolExecutor] クラスは、複数のワーカー スレッドが必要な場合、または ThreadPoolExecutor (このクラスが拡張する) の追加の柔軟性または機能が必要な場合、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 に答える