web-dev-qa-db-fra.com

Android: Comment 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()!

31
Primož Kralj

Au lieu de cela, implémentez 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.cancel () 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 d'annulation se comportera différemment en fonction de l'état d'exécution de votre tâche, consultez l'API pour plus de détails.

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

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

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

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

3
SLaks