web-dev-qa-db-ja.com

Android:Runnableを停止するにはどうすればよいですか?

私はこの方法を試しました:

_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()メソッドにアクセスできません!

31
Primož Kralj

代わりに、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を確認してください。

46
yorkw
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);                
        }
    }
};
15
user1549150
mHandler.removeCallbacks(updateThread);
14
王怡飞

changeColorは、kill()メソッドを持たないRunnableとして宣言されます。

Runnableを拡張し、(パブリック)kill()メソッドを追加する独自のインターフェイスを作成する必要があります。

3
SLaks