まず第一に、私は使用する方法を選ぶことさえできませんでした、私は今何時間も読んでいて、誰かが「ハンドラー」を使うと言い、誰かが「タイマー」を使うと言います。これが私が達成しようとしていることです:
設定では、繰り返しジョブを有効/無効にする設定(チェックボックス)があります。このチェックボックスがオンになっていると、タイマーが機能し始め、スレッドが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");
}
タイマージョブを実行するrefreshAllServersvoid:
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();
私が試したことは?
グーグルから見える例(ハンドラー、タイマー)を試してみましたが、どれも機能しませんでした。タイマーを1回開始できましたが、停止しても機能しませんでした。私の研究で見た最も単純で理解しやすいコードは次のとおりです。
new Java.util.Timer().schedule(
new Java.util.TimerTask() {
@Override
public void run() {
// your code here
}
},
5000
);
以下のスニペットを使用するだけです
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);
トリックを行う必要があります。
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();
みんなのおかげで、タイマーを使ってこの問題を修正しました。
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);
私は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);
「[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();
}