2017-10-28 7 views
1

Ich bin neu mit Android ... Ich entwickelte eine App, die Bilder durch Klicken auf eine Schaltfläche wechseln und ich ein Handler Runnable hinzufügen, um die Bilder automatisch Übergang (auch wenn Sie nicht auf die Schaltfläche drücken) mit einer Verzögerungszeit von 5000ms. aber ich muss den Handler für diese Verzögerung in dem Moment stoppen, in dem ich den Knopf drücke und das kann ich aus irgendeinem Grund nicht tun.Wie kann ich Runnable Handler in PostDelay stoppen

public class MainActivity extends AppCompatActivity { 

    private Integer images[]={R.drawable.pic1, R.drawable.pic21, .... 
    public int currImage=0; 
    public int ThreadCnt = 0; 
    public boolean backInt=true,forwardInc=false, ThreadInc=true; 
... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
... 
    initializeImageSwitcher(); 
    setInitialImage(); 
    setImageRotateListener(); 

    final Handler handler = new Handler(); 

      final Runnable run = new Runnable() { 
       @Override 
      public void run() { 

    //forwardInc is a Boolean indicating that click button occurred 
       if(forwardInc){ 
    //and in this case (of forwardInc=true) I want to stop runnable for 5sec 
        handler.removeCallbacks(this); 
        handler.postDelayed(this, 5000); 
        forwardInc=false; 
        setInitialImage(); 
        setImageRotateListener(); 
        currImage++; 
        ThreadCnt++; 
} 
      handler.postDelayed(this, 5000); 

    } 
    }; 
    handler.post(run); 

und dies ist der Code für die Schaltfläche klicken

public void setImageRotateListener() { 
     final Button rotatebutton=(Button) findViewById(R.id.btnRotateImage); 
     rotatebutton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currImage++; 
//forwardInc indicating that click button occurred 
       forwardInc=true; 
       ... 
       setCurrentImage(); 
    ... 
+0

Anruf 'handler.removeCallbacks (run)' um das 'Runnable' abzubrechen. – CommonsWare

+0

aber ich füge es bereits in der if-Anweisung in der run() -Methode hinzu. handler.removeCallbacks (this); –

+0

@CommonsWare aber ich füge es bereits in der if-Anweisung in der run() -Methode hinzu. 'handler.removeCallbacks (dies);' –

Antwort

0

Es ist noch nicht klar, was Sie zu tun versuchen. Aber soweit ich das verstehe, versuchen Sie folgendes:

Zuerst machen Sie die Runnable und die Handler global innerhalb der Klasse.

public class MainActivity extends AppCompatActivity{ 
    private Handler handler = new Handler(); 
    private Runnable runnable = new Runnable(){ 
     public void run(){/**/} 
    } 
    //other declarations. 
    //methods 
} 

Innen run-Methode von runnable:

public void run(){ 
    setInitialImage(); //probably set next image 
    currImage++; 
    ThreadCnt++; 
    handler.postDelayed(this, 5000) 
} 

Jetzt innen onClick:

public void onClick(View view){ 
    handler.removeCallbacks(this); 
    handler.postDelayed(this, 5000); 
    //no idea why you are using other code here. 
} 

Und innen onCreate:

//other lines 
setImageRotateListener(); 
handler.post(runnable); 
+0

Großartig !!! Ihre Lösung behebt das Problem. Kannst du bitte erklären, warum es wichtig war, 'Runnable' und' Handler' Global zu machen und warum 'handler.post (runnable);' in onCreate enthalten sein sollte. Vielen Dank. –

+0

Sie werden global gemacht, so dass sie von allen Methoden innerhalb dieser Klasse aus aufgerufen werden können. 'handler.post (runnable);' startet das 'runnable ', um es beim Starten der Aktivität zu starten, befindet es sich innerhalb von' onCreate'. –

Verwandte Themen