2017-06-01 10 views
0

Ich habe bereits überprüft Dieser Beitrag SO, aber ohne Erfolg: removeCallbacks not stopping runnableRunnable Code nicht für Android stoppen

Was meine app tut: Ich habe 2 imageViews. Wenn die Anwendung ausgeführt wird, sollte ein ImageView das Bild aus dem Standbild ändern, um das Bild zu aktivieren, und dann wieder in das Standbild zurückkehren. Dann wird der Handler für die Verzögerung verwendet, bevor dasselbe für die zweite Bildansicht ausgeführt wird. Und dann möchte ich, dass Runnable aufhört. Ich verwende Androids Frame-Animation. Bitte helfen!

public class MainActivity extends Activity { 

    AnimationDrawable[] animDrawList; 
    ImageView im; 
    ImageView im2; 

    private int curPos; 
    private Handler mHandler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     animDrawList = new AnimationDrawable[2]; 
     curPos = 0; 

     im = (ImageView)findViewById(R.id.image1); 
     im2 = (ImageView)findViewById(R.id.image2); 

     im.setBackgroundResource(R.drawable.animation_to_run); 
     im2.setBackgroundResource(R.drawable.animation_to_run); 

     animDrawList[0] = (AnimationDrawable) im.getBackground(); 
     animDrawList[1] = (AnimationDrawable) im2.getBackground(); 

     mHandler = new Handler(); 

     startTask(); 
    } 

    Runnable myThread = new Runnable() { 

     volatile boolean stopMe = false; 

     @Override 
     public void run() { 

      if (curPos <= 1) { 
       animDrawList[curPos].start(); 
       curPos++; 
      } 
      if (curPos > 1) { 
       stopMe = true; 
      } 

      if (stopMe) { 
       stopTask(); 
       return; 
      } 

      mHandler.postDelayed(myThread, 1000); 
     } 
    }; 

    void startTask() { myThread.run(); } 

    void stopTask() { mHandler.removeCallbacks(myThread); } 

}//end of MainActivity class 

Hier ist mein Layout-Datei, die straighforward ist:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="org.example.a.MainActivity"> 

    <ImageView 
     android:id="@+id/image1" 
     android:layout_width="90px" 
     android:layout_height="90px" 
     android:layout_alignParentStart="true" 
     android:layout_marginStart="14dp" 
     android:layout_marginTop="13dp" /> 

    <ImageView 
     android:id="@+id/image2" 
     android:layout_width="90px" 
     android:layout_height="90px" 
     android:layout_marginEnd="49dp" 
     android:layout_marginBottom="93dp" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentEnd="true" /> 
</RelativeLayout> 

Hier ist meine XML-Datei.

Die App läuft, keine Abstürze, aber es hört nicht auf. Ich möchte, dass das Runnable nach dem Animieren stoppt, warum ist meine Flagge "StopMe" nicht in Ordnung?

UPDATE FROM 4. JUNI 2017: Ich habe den Animationscode innerhalb der run-Methode entfernt und logcat output in run method hinzugefügt und Runnable stoppt mit "stopMe" boolean, so dass es Probleme mit der Frame-Animation gibt Kombiniere Androids Frame-Animation nicht mit Runnable? Ich werde das prüfen ...

+0

Geben Sie Ihre Layoutdatei und alle Fehlerprotokolle an. Auch "es funktioniert nicht" ist keine sehr nützliche Fehler-/Problembeschreibung. – scb998

Antwort

0

Sie brauchen nur eine Bedingung in der run-Methode

public void run() { 
    while(!stopMe) 
    { 
    if (curPos <= 1) { 
     animDrawList[curPos].start(); 
     curPos++; 
    } 
    if (curPos > 1) { 
     stopMe = true; 
    } 

    if (stopMe) { 
     stopTask(); 
     return; 
    } 

    mHandler.postDelayed(myThread, 1000); 
    } 
} 
+0

Vielen Dank für die Freigabe, nein das macht beide Bildansichten nur zur GLEICHEN ZEIT animieren und RUNNABLE endet nicht. – Bawb

0

ich es gelöst habe hinzuzufügen! Ich musste das SetOneShow des AnimationDrawable-Objekts (boolean playAnimationOncePerAnimationDrawableObject) auf true setzen! Voila!