私はこの方法を試しました:
_private Runnable changeColor = new Runnable() {
private boolean killMe=false;
public void run() {
//some work
if(!killMe) color_changer.postDelayed(changeColor, 150);
}
public void kill(){
killMe=true;
}
};
_
しかし、kill()
メソッドにアクセスできません!
代わりに、SDKが提供する既存のAPIを使用して、独自のthread.kill()
メカニズムを実装します。 threadpool 内でスレッド作成を管理し、 Future.cancel() を使用して実行中のスレッドを強制終了します。
ExecutorService executorService = Executors.newSingleThreadExecutor();
Runnable longRunningTask = new Runnable();
// submit task to threadpool:
Future longRunningTaskFuture = executorService.submit(longRunningTask);
... ...
// At some point in the future, if you want to kill the task:
longRunningTaskFuture.cancel(true);
... ...
Cancelメソッドは、タスクの実行状態に応じて異なる動作をします。詳細については、APIを確認してください。
public abstract class StoppableRunnable implements Runnable {
private volatile boolean mIsStopped = false;
public abstract void stoppableRun();
public void run() {
setStopped(false);
while(!mIsStopped) {
stoppableRun();
stop();
}
}
public boolean isStopped() {
return mIsStopped;
}
private void setStopped(boolean isStop) {
if (mIsStopped != isStop)
mIsStopped = isStop;
}
public void stop() {
setStopped(true);
}
}
クラス......
private Handler mHandler = new Handler();
public void onStopThread() {
mTask.stop();
mHandler.removeCallbacks(mTask);
}
public void onStartThread(long delayMillis) {
mHandler.postDelayed(mTask, delayMillis);
}
private StoppableRunnable mTask = new StoppableRunnable() {
public void stoppableRun() {
.....
onStartThread(1000);
}
}
};
mHandler.removeCallbacks(updateThread);
changeColor
は、kill()
メソッドを持たないRunnable
として宣言されます。
Runnable
を拡張し、(パブリック)kill()
メソッドを追加する独自のインターフェイスを作成する必要があります。