Ich habe die Ausführung eines for-loop auf Knopfdruck gestartet. Jetzt möchte ich, dass, wenn auf eine andere Schaltfläche geklickt wird, die Ausführung des zuvor gestarteten for-loop gestoppt wird und ich den Wert des Zählers abrufen möchte, wenn diese for-loop nicht mehr ausgeführt wird. Wie kann ich das erreichen?

public void clickStart(View view) {
        TextView textView = findViewById(R.id.textView);
        int counter = 0;
        for (int i=0;i<1500;i++) {
            counter = counter + 10;
            textView.setText(counter);
        }
    }

public void clickComplete(View view) {
    //Write code to stop executing for loop in clickStart()
}
0
Aman Verma 22 Feb. 2020 im 17:33

4 Antworten

Beste Antwort

Dies ist also nicht genau die Antwort darauf, wie Sie ein for-loop von außen stoppen können (für das Sie bereits Antworten von anderen Benutzern erhalten haben), aber nachdem Sie sich Ihre Frage angesehen haben, scheinen Sie zu versuchen, einen Zähler anzuzeigen, der sich erhöht in 10s in Ihrer Textansicht mit einer gewissen Verzögerung, für die Sie das for-loop verwenden.

Ich möchte darauf hinweisen, dass Ihr for-loop innerhalb weniger Millisekunden ausgeführt wird, dh sobald Sie auf die Schaltfläche zum Starten der Schleife klicken, zeigt Ihre Textansicht den endgültigen Wert des Zählers an, der 15000 in Ihrem ist Fall.

Wenn meine Annahme bezüglich der Verzögerung, die Sie benötigen, richtig war, können Sie den Handler verwenden und implementieren, wie unten gezeigt:

Deklarieren Sie diese zunächst als globale Variablen in Ihrer Aktivität oder Ihrem Fragment, in dem Sie sie verwenden werden.

TextView textView;
final Handler handler = new Handler();
Runnable runnable;
int counter;  //for the +10 counter you were originally using
int count;    //for number of times to execute

Textview muss aus mehreren Methoden aufgerufen werden, daher die globale Verwendung.

Jetzt können Sie in der Methode onCreate() den folgenden Code schreiben:

textView = findViewById(R.id.textView);
runnable = new Runnable() {
    public void run() {
        if (count <= 1500) {
            textView.setText(String.valueOf(counter));
            count++;
            counter += 10;
            handler.postDelayed(this, 500);
          //500 milliseconds for half a second delay change this as you require
        } else {
            handler.removeCallbacks(this);
        }
    }
};

In der run() -Methode befindet sich der Code, der bestimmt, was nach der genannten Verzögerung ausgeführt werden soll.

Angenommen, Sie wissen, wie Sie onClickListeners für Ihre Schaltflächen verwenden, sollte Ihre startClick -Methode folgendermaßen aussehen:

public void startClick(View v) {
        counter = 0;
        count = 0;
        handler.post(runnable);
    }

Jedes Mal, wenn Sie auf Startzähler klicken, wird der Wert auf 0 zurückgesetzt, wenn Sie nicht möchten, dass die Initialisierungswerte außerhalb der Startfunktion in onCreate vor der Ausführung zurückgesetzt werden. Schließlich sollte die clickComplete -Methode darin bestehen, die ausführbare Datei einfach wie folgt zu stoppen:

public void clickComplete(View v) {
        handler.removeCallbacks(runnable);
    }

Lassen Sie mich wissen, ob dies für Sie hilfreich war.

1
ljk 22 Feb. 2020 im 17:04

Unterwegs können Sie Ihrem Code eine Methode hinzufügen:

public boolean isRunning()
        {
            return this.keepRunning;
        }

Und in Ihrem Code tun Sie dies:

public void clickStart(View view) {
        TextView textView = findViewById(R.id.textView);
        int counter = 0;
        for (int i=0;i<1500;i++) {
            counter = counter + 10;
            textView.setText(counter);
            if(isRunning){
            keepRunning=false;
            break;
            }
        }
    }

public void clickComplete(View view) {
    //Write code to stop executing for loop in clickStart()
      this.keepRunning=true;

}

Der zweite Weg ist die Verwendung von Handler-Thread:

Anstatt eine for-Schleife zu verwenden, können Sie die Runnable-Instanz für eine bestimmte Anzahl von Malen selbst aufrufen lassen. Diese Aufrufe werden in die UI-Thread-Warteschlange gestellt. Denken Sie also daran.

Der folgende Code sollte es tun:

final Handler handler = new Handler(); 
int count = 0;

final Runnable runnable = new Runnable() {
    public void run() { 
        // need to do tasks on the UI thread 
        Log.d(TAG, "Run test count: " + count);
        if (yourcondition) {
        handler.removeCallbacksAndMessages(null);
        }
    } 
}; 

// trigger first time 
handler.post(runnable);
0
Muhammad Zahab Ahmed Khan 22 Feb. 2020 im 20:09
    private Boolen isComplete = false;

    public void clickStart(View view) {
            TextView textView = findViewById(R.id.textView);
            int counter = 0;
            for (int i=0;i<1500;i++) {
                counter = counter + 10;
                textView.setText(counter);
                if(isComplete){
                 isComplete = false;
                 break;

                }
            }
        }

        public void clickComplete(View view) {
            isComplete = true;
        }
0
sinanbasormanci 22 Feb. 2020 im 14:39

Du könntest es so machen

public boolean stopExecution = false;
public int counter = 0;

public void clickStart(View view) {
       TextView textView = findViewById(R.id.textView);

        counter = 0;
        for (int i=0;i<1500;i++) {
            counter = counter + 10;
            textView.setText(counter);
            // also here use String.valueOf(counter) this would throw sn error in my android studio

            if(stopExecution){
                  stopExecution = false;
                  break;
             }
        }
}

public void clickComplete(View view) {
       stopExecution = true;

       // you can access the "global" value counter from here at whatever value it stopped
       // in case it is still running it will break the execution and you will have the vslue where it stopped
       // but the processor should handle it very fast so maybe you need some delayed loop or ?
)
1
Sagan 22 Feb. 2020 im 17:56