39 votes

removeCallbacks ne s'arrêtant pas runnable

J'appelle d'une méthode :

myHandler.postDelayed(mMyRunnableHide, 6000);

qui appelle :

public Runnable mMyRunnableHide = new Runnable()
{

    public void run()
    {
        mTextDisplay.setText("");
        DisplayX();
    }
 };

si un bouton à l'écran est cliqué, je veux arrêter le runnable :

   Button next = (Button) findViewById(R.id.Breaction);
    next.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {

            myHandler.removeCallbacks(mMyRunnableHide);

            mTextDisplay.setText("");
            DisplayX();
            }
        });   
    }

les rappels amovibles ne bloquent pas le fonctionnement. Qu'est-ce que je fais de mal ? Est-ce que j'utilise la bonne méthode ? Je veux juste que le runnable ne s'exécute pas lorsque l'utilisateur clique sur le bouton.

Merci pour votre aide.

7voto

James L. Points 2741

Voici une autre façon d'accomplir ce que mtmurdock décrit. Cette classe permettra d'éditer les variables d'instance dans n'importe quelle classe que votre Runnable est défini comme une classe interne anonyme.

package support;

/**
* Runnable that can be stopped from executing
*/
public abstract class KillableRunnable implements Runnable{

private boolean isKilled=false;

/**
 * Instead of Overriding run(), override this method to perform a Runnable operation. 
 * This will allow editing instance variables in the class that this Runnable is defined
 */
public abstract void doWork();

//The handler that posts this Runnable will call this method. 
//By default, check if it has been killed. doWork() will now be the method 
//override to implement this Runnable
@Override
final public void run(){
    if(!isKilled){
        doWork();
    }
}

final public void kill(){
    isKilled=true;
}
}

0voto

xiangyu shi Points 1

Je ne pense pas que removeCallbacks (..) arrête seulement les messages en attente (Runnables) Je pense que removeCallbacks (..) ne fonctionne pas ont une autre cause,mais je ne sais pas. parce que postDelayed(..) etremoveCallbacks (..) est dans le même thread

0voto

Eloy Velazquez Points 1

ce qui suit a fonctionné pour moi. Placez-le sur Resume.

mService= null;

public void onServiceConnected(ComponentName name, IBinder service) {
        Log.i(TAG, "OnServiceConnected");
        ContadorFG.LocalBinder binder = (ContadorFG.LocalBinder) service;
        mService = binder.getService();
        connected = true;
        synchronized (lock){
            lock.notifyAll();
        }
    }

public void onResume() {
    super.onResume();
    loopDelayed();
}  

private void loopDelayed(){ 
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (mService != null) {

                ----
                ----
                ----

                return;
            }else{
                //auto call 
                loopDelayed();
            }
        }
    }, 10);

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X