Android: Comment puis-je arrêter Runnable?

J'ai essayé de cette façon:

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;
   }
};

Mais je ne peux pas accéder à la méthode kill()!

29
demandé sur Marcin Orlowski 2012-02-27 02:58:46

4 réponses

Implémentez plutôt votre propre mécanisme thread.kill(), en utilisant L'API existante fournie par le SDK. Gérez la création de votre thread dans un threadpool , et utilisez Future.annuler() pour tuer le thread en cours d'exécution:

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

La méthode Cancel se comportera différemment en fonction de l'état d'exécution de votre tâche, Vérifiez l'API pour plus de détails.

43
répondu yorkw 2018-10-03 05:11:33
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);
    }
}

Classe ......

    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
répondu user1549150 2012-12-04 12:14:49
mHandler.removeCallbacks(updateThread);
11
répondu 王怡飞 2015-11-02 01:37:40

changeColor est déclaré comme Runnable, qui n'ont pas de kill() méthode.

Vous devez créer votre propre interface qui étend Runnable et ajoute une méthode (publique) kill().

3
répondu SLaks 2012-02-26 23:00:35