Android Progress Bar nach Zeit füllen?

1 Antwort

Ganz grob und möglicherweise ein wenig fehlerhaft, da nicht (komplett) getestet:

new Thread(){
    @Override public void run(){
        try{
            for(int progress = 0; progress <= 100 && !isInterrupted(); progress += 50){
                runOnUiThread(new Runnable(){
                    @Override public void run(){
                        myProgressBar.setProgress(progress);
                    }
                });
                Thread.sleep(2500);
            }
        }
        catch(InterruptedException ex){}
    }
}.start();

In dem Fall wird angenommen, dass die ProgressBar unter dem Identifier myProgressBar "erreichbar" ist.

fishgamerYT 
Fragesteller
 17.03.2019, 02:27

Vielen Dank erstmal für deine Antwort!

Also, ich verstehe so ziemlich was du meinst, jedoch verstehe ich nicht ganz wo ich einstellen könnte wie lange dieser Prozess dauert, ist die 2500 bei "Thread.sleep" die Hälfte von 5000 Millisekunden?

LG, fishgamer

0
Isendrak  17.03.2019, 02:30
@fishgamerYT
ist die 2500 bei "Thread.sleep" die Hälfte von 5000 Millisekunden?

In der Tat.

Um das ganze mal etwas aufzudröseln:

  1. Ein Thread wird gestartet, in dem eine for-Schleife die Zählerstände 0, 50 und 100 annimmt.
  2. Mittels eines Runnables wird im UI-Thread ein Stück Code aufgerufen, das den Status der ProgressBar aktualisiert (Zugriffe auf UI-Elemente müssen im UI-Thread erfolgen).
  3. Der Thread wartet 2500ms.
0
fishgamerYT 
Fragesteller
 17.03.2019, 02:28

Übrigens, ich will nicht dass sich auf einmal die Hälfte der progressbar füllt und dann sie voll wird, sondern dass das alles gleichmäßig und ohne stocken sich füllt

0
Isendrak  17.03.2019, 02:33
@fishgamerYT

Okay, in dem Fall könntest du das ganze z.B. so abändern:

new Thread(){
    @Override public void run(){
        try{
            for(int progress = 0; progress <= 100 && !isInterrupted(); ++progress){
                runOnUiThread(new Runnable(){
                    @Override public void run(){
                        myProgressBar.setProgress(progress);
                    }
                });
                Thread.sleep(50);
            }
        }
        catch(InterruptedException ex){}
    }
}.start();

50 Millisekunden = 1% von 5 Sekunden.

0
fishgamerYT 
Fragesteller
 17.03.2019, 13:44
@Isendrak

Ich habe nochmal eine Frage:
Ich kenne mich nich viel mit Threads aus. Wo müsste ich das ganze aufrufen bzw. wo müsste ich diesen Thread aufgreifen?

0
Isendrak  17.03.2019, 14:05
@fishgamerYT

Wenn du diesen Codeschnipsel so wie er ist verwenden willst, dann kommt er dahin, wo festgestellt wurde, dass der Button gedrückt wurde.

Also in etwa so:

public void OnClick(View v){
    if(v == myButton){
        /*Hier der Code*/
    }
}
0
fishgamerYT 
Fragesteller
 17.03.2019, 14:18
@Isendrak

Okay das funktioniert super, danke!
Nur, ich möchte dass das ganze bei einem TouchEvent gemacht wird.
Damit meine ich: Solange man einen Button drückt, füllt sich die Progress bar, wenn man ihn loslässt, setzt sie sich wieder auf 0. Wenn sie voll ist soll sie ebenfalls auf 0 gesetzt werden.
Wie breche ich diesen Thread ab?

0
Isendrak  17.03.2019, 15:21
@fishgamerYT

Okay, das wir n bissl schwieriger.

Zunächst mal verpasst du deiner Klasse ein boolean-Feld, z.B.

protected boolean stop_thread;

Dann im Event-Code der aufgerufen wird, sobald der Button losgelassen wird das:

stop_thread = true;

Und noch im Event-Code für "Button gedrückt" das:

stop_thread = false;
new Thread(){
    @Override public void run(){
        try{
            for(int progress = 0; progress <= 100 && !isInterrupted() && !stop_thread; ++progress){
                runOnUiThread(new Runnable(){
                    @Override public void run(){
                        myProgressBar.setProgress(progress);
                    }
                });
                Thread.sleep(50);
            }
            runOnUiThread(new Runnable(){
                 @Override public void run(){
                     myProgressBar.setProgress(0);
                 }
            });
        }
        catch(InterruptedException ex){}
    }
}.start();
0
fishgamerYT 
Fragesteller
 17.03.2019, 15:53
@Isendrak

Es hat perfekt funktioniert.

Ich werde mich in der nächsten Zeit mehr mit Threads beschäftigen, vielleicht verstehe ich dann ungefähr wie das prinzip dahinter ist.

Ich bin dir wirklich sehr dankbar! Vielen Dank :)

LG

0
fishgamerYT 
Fragesteller
 17.03.2019, 15:54
@Isendrak

Mich würde es übrigens auch freuen wenn du meine Freundschaftsanfrage annimmst ^^

0