RemoveCallbacks nicht stoppen runnable

Ich rufe von einer Methode an:

myHandler.postDelayed(mMyRunnableHide, 6000); 

Die ruft:

  • Generic Adapter für viele Arten von listview 's Layout Zeile in Android
  • OnTouchevent () vs onTouch ()
  • Proguard Ausgabe für Mupdf Bibliothek
  • Wie man gemeinsames Layout zwischen Aktivitäten ohne Fragment teilt
  • Eclipse Content Assist funktioniert nicht mit Android
  • Halten Sie einen Hintergrundprozess in robospice
  •  public Runnable mMyRunnableHide = new Runnable() { public void run() { mTextDisplay.setText(""); DisplayX(); } }; 

    Wenn eine Schaltfläche auf dem Bildschirm geklickt wird, möchte ich das Runnable stoppen:

      Button next = (Button) findViewById(R.id.Breaction); next.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { myHandler.removeCallbacks(mMyRunnableHide); mTextDisplay.setText(""); DisplayX(); } }); } 

    Die removecallbacks stoppt nicht das lauffähige. Was mache ich falsch? Bin ich die richtige Methode? Ich möchte nur, dass die Runnable "Not Run", wenn der Benutzer auf die Schaltfläche klickt.

    Danke für jede Hilfe.

  • Überprüfen Sie den Zugriff auf Benachrichtigungen über NotificationListenerService
  • Android-Anwendung schließen
  • Android twitter4j Bild hochladen
  • Sperrbild deaktivieren
  • App vergisst Sharefvoreinstellungen beim Neustart
  • RecyclerView GridLayoutManager: Wie kann man die Spanne automatisch erkennen?
  • 3 Solutions collect form web for “RemoveCallbacks nicht stoppen runnable”

    Es scheint mir, dass removeCallbacks(..) nur anstehende Nachrichten (Runnables) anhält. Wenn dein Runnable bereits angefangen hat, dann gibt es kein Stoppen (zumindest nicht auf diese Weise).

    Alternativ können Sie die Runnable-Klasse erweitern und ihm eine Art Kill-Switch wie folgt geben:

     public class MyRunnable implements Runnable { private boolean killMe = false; private void run() { if(killMe) return; /* do your work */ } private void killRunnable() { killMe = true; } } 

    Dies wird nur verhindern, dass es zu starten, aber Sie könnten gelegentlich überprüfen killMe und Rettung aus. Wenn du das Runnable schlepptest (wie eine Art Hintergrundfaden) kannst du sagen:

     while(!killMe) { /* do work */ } 

    Hoffe das hilft

    EDIT Ich wollte nur ein Update auf diesem. Seit dieser ursprünglichen Post hat Google eine tolle Klasse namens AsyncTask, die alle diese Sachen für Sie behandelt. Jeder, der das liest, sollte es wirklich sehen, weil es die richtige Art ist, Dinge zu tun.

    Sie können hier darüber lesen

    Hier ist ein weiterer Weg, um zu erreichen, was mtdurdock beschreibt. Diese Klasse erlaubt die Bearbeitung von Instanzvariablen in jeder Klasse, die Ihr Runnable als anonyme innere Klasse definiert.

     package support; /** * Runnable that can be stopped from executing * @author JTRONLABS */ 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; } } 

    Handler.removeCallback ist synchron und wird gut funktionieren:

    1. Sie rufen postDelayed immer im Haupt-Thread.
    2. Sie rufen removeCallback immer im Hauptthread auf
    3. Sie rufen nach dem postDelayed keine postDelayed .

    Also in deinem Fall wird removeCallbacks von einem Button-Handler aufgerufen, der im Haupt-Thread läuft. Aber du hast in deinem Code nicht den Punkt gezeigt, von wo aus du postDelayed . Wenn du es von einem Hintergrund-Thread nennst, wo dein Problem ist.

    Wenn Sie sicher sind, dass Sie keine dieser Methoden von Hintergrund-Threads anrufen und die Reihenfolge der Anrufe korrekt ist, dann können Sie unangemessene Aufgaben unverändert lebendig aufgrund der Aktivitätserholung auf Konfigurationsänderungen (Bildschirmrotation usw.) verlassen. Vergewissern Sie sich, dass removeCallbacks in der onDestroy Methode wieder zurückkehren onDestroy , um diese Art von Problemen zu vermeiden.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.