2012-02-26 11 views
24

私はこの方法で試してみました: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()メソッドにアクセスすることはできません!

答えて

37

SDKが提供する既存のAPIを使用して、独自のthread.kill()メカニズムを実装してください。あなたのスレッドの作成はthreadpool内の管理、および実行中のスレッドを殺すためにFuture.cancel()を使用します。

ExecutorService threadPoolExecutor = Executors.newSingleThreadExecutor(); 
Runnable longRunningTask = new Runnable(); 

// submit task to threadpool: 
Future longRunningTaskFuture = threadPoolExecutor.submit(longRunningTask); 

... ... 
// At some point in the future, if you want to kill the task: 
longRunningTaskFuture.cancel(true); 
... ... 

は方法がより多くの詳細については、APIをチェックし、あなたのタスク実行状態に基づいて異なる動作をしますキャンセル。

+0

ありがとうございます。私はAPIよりも多くの制御が必要なので、今回は使用しません。ありがとう。 –

+4

Executors.newSingleThreadExecutor()は、タイプThreadPoolExecutorではありません。 –

+0

'longRunningTask'にタスクのリストが含まれている場合、どのように特定のタスクの実行を中止できますか?スレッドが同時に実行されている可能性があります。 – Stallman

3

changeColorRunnableと宣言されており、kill()メソッドはありません。

Runnableに拡張された独自のインターフェイスを作成し、(公開)kill()メソッドを追加する必要があります。

+0

私は新しいクラスを作成する場合、コンパイラはに問題があると言い、 "color_changer.postDelayed(changeColor、150);" - changeColorを変数に解決することはできません。 –

+0

いいえ。私はインターフェイスを意味します。ただし、非匿名クラスを作成することもできます。 「これ」を意味しますか? – SLaks

+0

はい、私はそれを意味しました、ありがとうございます。 –

14
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);     
     } 
    } 
}; 
+6

この実装があなたのRunnableのCPUサイクルを使い果たしてしまうことは分かりますか? – stephen

8
mHandler.removeCallbacks(updateThread); 
+4

してください、答えを記述しようとしてください – manetsus

+1

これは私にとって最も簡単な方法です。 – bpiec

+1

実際には、yada-yadaを含むカスタムRunnableを作成したり、ExecutorServiceを使用したりする必要がないので、これは適切な答えです。これは 'removeCallbacks'メソッドがあるところです。これはJavaScriptの 'clearTimeout'と同じパターンです。 –

関連する問題