Hallo ihr Lieben,
ich bin neu hier (und auch in der Android-Entwicklung), habe aber schon ca 5 Jahre Erfahrung in Java, doch zur Zeit stehe ich irgendwie auf dem Schlauch, was die Progressbars angeht.
Grobe Beschreibung:
Ich habe vor Jahren ein Sudoku Solver in Java geschrieben und jetzt hatte ich die Idee, das Ganze in eine App zu packen. Die Berechnung funktioniert auch super, allerdings dauert die Berechnung bei uneindeutigen Sudokus (z.B. wenn man gar keine Zahlen eingibt) ca 8 Sekunden. Damit die Benutzer nicht denken, die App sei abgestürzt, wollte ich eine horizontale Progressbar hinzufügen. Dafür habe ich eine neue Klasse "AktualisiereProgressbar" angelegt die von Thread erbt und sie in meiner MainActivity mit:
AktualisiereProgressbar pb = new AktualisiereProgressbar(this);
pb.start();
gestartet.
Hier mal die Klasse "AktualisiereProgressbar":
package com.example.matthias.sudokusolver;
import android.widget.ProgressBar;
public class AktualisiereProgressbar extends Thread{
private MainActivity mainAct;
private int counter;
private boolean laeuftNoch;
public AktualisiereProgressbar(MainActivity ma){
mainAct = ma;
mainAct.progress = (ProgressBar) ma.findViewById(R.id.progressBar);
ma.progress.setMax(100);
counter = 0;
}
public void stoppe(){
laeuftNoch = false;
mainAct.progress.setProgress(mainAct.progress.getMax());
}
@Override
public void run(){
this.laeuftNoch = true;
counter = 0;
while(laeuftNoch){
if(counter < 100) {
counter = counter + 5;
}else{
counter = 0;
}
mainAct.progress.setProgress(counter);
try {
Thread.sleep(400);
} catch (Exception e) {
}
System.out.println("********************************************** Ich laufe noch counter = " + counter + "**********************************************");
}
}
}
Alles anzeigen
Dem Konstruktor übergebe ich also das Objekt meiner MainActivity, damit dieser Thread jederzeit den Progress-Wert ändern kann. Mein Problem ist nun, dass sich die Progressbar während der Ausführung des Solvers nicht ändert. Mache ich allerdings eine Ausgabe des aktuellen Progresswerts (wie oben angedeutet), dann werden, wie ich mir das vorstelle, nebenläufig die Progress-Werte ausgegeben. Den Solver lasse ich mit einem Callable-Future-Objekt ebenfalls nebenläufig berechnen. Das Ganze sieht in der MainActivity dann so aus:
AktualisiereProgressbar pb = new AktualisiereProgressbar(this);
pb.start();
ExecutorService executor = Executors.newFixedThreadPool(10);
List<Future<Kaestchen[][]>> list = new ArrayList<Future<Kaestchen[][]>>();
Callable<Kaestchen[][]> callable = new Sudoku(feld);
((Sudoku)callable).setMainAct(this);
Future<Kaestchen[][]> future = executor.submit(callable);
list.add(future);
Alles anzeigen
Habt ihr eine Idee, was ich noch falsch mache?
Liebe Grüße Matthias