Arrêter handler.postDelayed ()

109

J'appelle plusieurs Handlers par new Handler (). PostDelayed (new Runnable () ..... Comment puis-je l'arrêter lorsque je clique sur retour?

public class MyActivity extends AppCompatActivity implements OnClickListener {

    private Button btn;
    private Handler handler;
    private Runnable myRunnable;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        btn = (Button) findViewById(R.id.trainingsstart);
        btn.setOnClickListener(this);   
    }

    @Override
    public void onClick(View v) {
        Handler handler =  new Handler();
        Runnable myRunnable = new Runnable() {
            public void run() {
                // Things to be done
            }
        };

        handler.postDelayed(myRunnable, 3000);
    }

    @Override 
    public void onBackPressed() { 
        super.onBackPressed();
        handler.removeCallbacks(myRunnable);
    }   
}

J'ai le problème que mes gestionnaires n'ont pas de nom comme "myHandler". Comment puis-je gérer cela?

Merci pour l'aide!

Maintenant, j'ai ces erreurs:

03-28 17:47:03.662: E/AndroidRuntime(1961): FATAL EXCEPTION: main
03-28 17:47:03.662: E/AndroidRuntime(1961): java.lang.NullPointerException
03-28 17:47:03.662: E/AndroidRuntime(1961):     at de.basti12354.tage.uebungen.Tag1.onBackPressed(Tag1.java:120)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.app.Activity.onKeyUp(Activity.java:2159)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.KeyEvent.dispatch(KeyEvent.java:2647)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.app.Activity.dispatchKeyEvent(Activity.java:2389)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1860)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3791)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3774)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3516)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3666)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:1982)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1698)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1689)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1959)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.os.MessageQueue.nativePollOnce(Native Method)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.os.MessageQueue.next(MessageQueue.java:132)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.os.Looper.loop(Looper.java:124)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.app.ActivityThread.main(ActivityThread.java:5103)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at java.lang.reflect.Method.invokeNative(Native Method)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at java.lang.reflect.Method.invoke(Method.java:525)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at dalvik.system.NativeStart.main(Native Method)
basti12354
la source

Réponses:

197

Vous pouvez utiliser:

 Handler handler = new Handler()
 handler.postDelayed(new Runnable())

Ou vous pouvez utiliser:

 handler.removeCallbacksAndMessages(null);

Docs

public final void removeCallbacksAndMessages (jeton d'objet)

Ajouté au niveau d'API 1 Supprimez tous les messages en attente de rappels et les messages envoyés dont l'objet est un jeton. Si le jeton est nul, tous les rappels et messages seront supprimés.

Ou vous pouvez également faire comme suit:

Handler handler =  new Handler()
Runnable myRunnable = new Runnable() {
public void run() {
    // do something
}
};
handler.postDelayed(myRunnable,zeit_dauer2);

Ensuite:

handler.removeCallbacks(myRunnable);

Docs

public final void removeCallbacks (Runnable r)

Ajouté au niveau d'API 1 Supprimez toutes les publications en attente de Runnable r qui se trouvent dans la file d'attente de messages.

public final void removeCallbacks (Runnable r, jeton d'objet)

Éditer:

Change ça:

@Override
public void onClick(View v) {
    Handler handler =  new Handler();
    Runnable myRunnable = new Runnable() {

À:

@Override
public void onClick(View v) {
    handler = new Handler();
    myRunnable = new Runnable() { /* ... */}

Parce que vous avez le ci-dessous. Déclaré auparavant, onCreatemais vous l'avez déclaré à nouveau, puis initialisé en onClickconduisant à un NPE.

Handler handler; // declared before onCreate
Runnable myRunnable;
Raghunandan
la source
1
Avoir ajouter le handler.removeCallbacks (myRunnable); à mon onBackPressed () est-ce vrai?
basti12354
1
@ user3433232 utilisez-le vous voulez arrêter la course
Raghunandan
1
Pouvez-vous s'il vous plaît regarder mon code, j'essaie d'utiliser votre aide », mais maintenant j'ai les erreurs, vous pouvez voir à mon message.
basti12354
1
@ user3433232 vérifiez la modification. Votre gestionnaire était nul. Vous l'avez déclaré de nouveau dans onClick menant à NPE
Raghunandan
6
Je travaille sur l'API 16 et handler.removeCallbacks (exécutable) ne fonctionne pas. Mais handler.removeCallbacksAndMessages (null); fonctionne merci
mismanc
12

Vous pouvez définir un booléen et le changer en false lorsque vous souhaitez arrêter le gestionnaire. Comme ça..

boolean stop = false;

handler.postDelayed(new Runnable() {
    @Override
    public void run() {

        //do your work here..

        if (!stop) {
            handler.postDelayed(this, delay);
        }
    }
}, delay);
Emre AYDIN
la source
10

cela peut être vieux, mais pour ceux qui recherchent une réponse, vous pouvez utiliser ceci ...

public void stopHandler() {
   handler.removeMessages(0);
}

à votre santé

ralphgabb
la source
2
  Boolean condition=false;  //Instance variable declaration.

 //-----------------Inside oncreate--------------------------------------------------- 
  start =(Button)findViewById(R.id.id_start);
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                starthandler();

                if(condition=true)
                {
                    condition=false;
                }


            }
        });

        stop=(Button) findViewById(R.id.id_stoplocatingsmartplug);

        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                stophandler();

            }
        });


    }

//-----------------Inside oncreate---------------------------------------------------

 public void starthandler()
    {

        handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {


                if(!condition)
                {
                    //Do something after 100ms 


                }

            }
        }, 5000);

    }


    public void stophandler()
    {
        condition=true;
    }
vinay shetty
la source
Veuillez expliquer pourquoi ce morceau de code répond à la question.
André Kool
Supposons que vous ayez 2 boutons dans XML start et stop. Ce code montre la démonstration de la façon dont le gestionnaire peut être démarré avec le clic du bouton de démarrage et peut être arrêté par le bouton d'arrêt.
vinay shetty
Cela fonctionne mais le runnable fonctionne toujours en arrière-plan.
ColdTuna