Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Das kommt daher, dass du zwei unterschiedliche Threads verwendest und Instanzvariablen. Threads arbeiten gesondert vom normalen Programmcode und haben dafür einen internen Speicher. In diesen werden alle benötigten Instanzvariablen als lokale Variablen gespeichert und dort erstmal die Werte geändert, bevor sie irgendwann später mal Einzug in die Instanzvariablen des Programms finden.
Du erlebst hier gerade ein typisches Phänomen von Multithreading: RaceConditions (glaub zumindest, dass es das ist. ).
Um Abhilfe zu schaffen, musst du in die Variablendeklaration
Java:
volatile
.
Java:
private volatile int progress;
private volatile boolean done;
Dann sollte dein Problem behoben werden. Und schau dir unbedingt das Thema Multithreading an! Wenn man da nicht aufpasst, erlebt man solche Probleme, wie du sie gerade erlebst!
Danke, allerdings bleibt der Wert immer noch bei null. Ich hab das jetzt so gelöst: ich die Variablen und die beiden return-Funktionen als static deklariert. Dann gehts
Ja, weil sich dann alle Instanzen die selben variablen teilen. Das sollte aber nicht deine Lösung sein... Das einzige static dass du anfangs brauchst ist das static an deiner main Methode.
Beheb den Fehler lieber richtig (also ohne static).
private volatile int progress = 0;
private volatile boolean done;
public void download(final String quelle, final String ziel) {
Thread t = new Thread() {
public void run() {
try {
done = false;
final URL url = new URL(quelle);
final URLConnection connection = url.openConnection();
final InputStream inputstream = new BufferedInputStream(connection.getInputStream());
final OutputStream outputstream = new BufferedOutputStream(new FileOutputStream(ziel));
int totalSize = connection.getContentLength();
byte[] chunk = new byte[1024];
int chunkSize;
File fileZiel = new File(ziel);
while ((chunkSize = inputstream.read(chunk)) != -1) {
outputstream.write(chunk, 0, chunkSize);
int currentSize = (int) fileZiel.length();
progress = (currentSize * 100 / totalSize);
}
outputstream.flush();
outputstream.close();
inputstream.close();
progress = 0;
done = true;
} catch(Exception e) {
JOptionPane.showMessageDialog(null, e, "Fehler" + e, JOptionPane.OK_OPTION);
}
}
};
t.start();
}
public int getProgress() {
return progress;
}
public boolean getDone() {
return done;
}
Java:
public void updateProgress() {
Thread t = new Thread() {
public void run() {
while (!essentials.getDone()) {
progressBar.setValue(essentials.getProgress());
}
}
};
t.start();
}