Skip to content

Instantly share code, notes, and snippets.

@MobiDevelop
Created August 12, 2013 21:58
Show Gist options
  • Save MobiDevelop/6215682 to your computer and use it in GitHub Desktop.
Save MobiDevelop/6215682 to your computer and use it in GitHub Desktop.
An example of downloading a file and displaying progress with the LibGDX Net module.
package com.badlogic.gdx.tests.lwjgl;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Net.HttpMethods;
import com.badlogic.gdx.Net.HttpRequest;
import com.badlogic.gdx.Net.HttpResponse;
import com.badlogic.gdx.Net.HttpResponseListener;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.esotericsoftware.tablelayout.Value;
public class Snippet {
public static void main (String[] args) {
new LwjglApplication(new ApplicationAdapter() {
Stage stage;
Skin skin;
TextButton button;
@Override
public void create () {
stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
skin = new Skin(Gdx.files.internal("data/uiskin.json"));
Gdx.input.setInputProcessor(stage);
Table container = new Table();
container.setFillParent(true);
button = new TextButton("Click to download", skin);
button.getStyle().disabled = skin.newDrawable("default-round", Color.DARK_GRAY);
container.row();
container.add(button).width(Value.percentWidth(0.50f));
stage.addActor(container);
button.addListener(new ClickListener() {
@Override
public void clicked (InputEvent event, float x, float y) {
if (!button.isDisabled()) {
button.setDisabled(true);
// Make a GET request
HttpRequest request = new HttpRequest(HttpMethods.GET);
request.setTimeOut(2500);
request.setUrl("http://libgdx.badlogicgames.com/nightlies/libgdx-nightly-latest.zip");
// Send the request, listen for the response
Gdx.net.sendHttpRequest(request, new HttpResponseListener() {
@Override
public void handleHttpResponse (HttpResponse httpResponse) {
// Determine how much we have to download
long length = Long.parseLong(httpResponse.getHeader("Content-Length"));
// We're going to download the file to external storage, create the streams
InputStream is = httpResponse.getResultAsStream();
OutputStream os = Gdx.files.external("libgdx-nightly-latest.zip").write(false);
byte[] bytes = new byte[1024];
int count = -1;
long read = 0;
try {
// Keep reading bytes and storing them until there are no more.
while ((count = is.read(bytes, 0, bytes.length)) != -1) {
os.write(bytes, 0, count);
read += count;
// Update the UI with the download progress
final int progress = ((int) (((double) read / (double) length) * 100));
final String progressString = progress == 100 ? "Click to download" : progress + "%";
// Since we are downloading on a background thread, post a runnable to touch ui
Gdx.app.postRunnable(new Runnable() {
@Override
public void run () {
if (progress == 100) {
button.setDisabled(false);
}
button.setText(progressString);
}
});
}
} catch (IOException e) {
}
}
@Override
public void failed (Throwable t) {
Gdx.app.postRunnable(new Runnable() {
@Override
public void run () {
button.setText("Too bad. Download failed.");
}
});
}
});
}
}
});
}
@Override
public void render () {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
stage.act();
stage.draw();
}
}, "Download Example", 480, 320, true);
}
}
@codeulike
Copy link

Thanks, this was very useful. Don't you need to close the OutputStream at the end?

@kirbodevv
Copy link

Thanks, i wrote the downloading based on your solution

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment