Asynchronous Task
Executing background tasks in order to not lock the Main Thread.
Using AsyncTask class to execute background tasks
Button dldButton = new Button("download zip");
add(dldButton, CENTER, CENTER);
final ProgressBar progressBar = new ProgressBar();
add(progressBar, CENTER, AFTER + UnitsConverter.toPixels(DP + 16),
PARENTSIZE + 80, PREFERRED);
dldButton.addPressListener((c) -> {
new AsyncTask()<Void, Void, Void> {
int progress = 0;
UpdateListener updateListener = null;
@Override
protected Object doInBackground(Object... objects) {
HttpStream.Options o = new HttpStream.Options();
o.httpType = HttpStream.GET;
final String url = "<INSERT AN URL TO DOWNLOAD A ZIP FILE>";
if(url.startsWith("https:"))
o.socketFactory = new SSLSocketFactory();
try {
HttpStream p = new HttpStream(new URI(url));
File f = new File("file.zip", File.CREATE_EMPTY);
int totalSize = p.contentLength;
byte [] buff = new byte[4096];
BufferedStream bs = new BufferedStream(f, BufferedStream.WRITE, 4096);
int counter = 0;
while(true) {
int size = p.readBytes(buff, 0, buff.length);
counter += size;
progress = (int)((counter/(double)totalSize)*100);
if(size <= 0) break;
bs.writeBytes(buff, 0, size);
}
progress = 100;
bs.close();
p.close();
f.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute() {
dldButton.setEnabled(false);
MainWindow.getMainWindow().addUpdateListener(updateListener = (elapsed) -> {
progressBar.setValue(progress);
});
}
@Override
protected void onPostExecute(Object result) {
dldButton.setEnabled(true);
MainWindow.getMainWindow().removeUpdateListener(updateListener);
}
}.execute();
});Last updated
Was this helpful?