Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

libgdx - doing something in other thread not working

My game has a stats queue, after each game the current game stats goes into the queue. Whenever the mainmenu starts i want to upload all the game stats to a server, and this take like 1-3 seconds and I want to do this in an other thread.

My code

    @Override
    public void show() {
        Global.key = Global.getKey();
        // System.out.println(Stats.getJSONObject(Global.key));

        Gdx.app.postRunnable(new Runnable() {
            @Override
            public void run() {

                Stats.TryUploadGame1();
                System.out.println("DONE");
            }
        });
.....

}

But this also freezes my game.

What should I do?

like image 703
Boldijar Paul Avatar asked Oct 22 '25 22:10

Boldijar Paul


1 Answers

Your current code is posting a Runnable instance that will be executed by the render thread before the next frame. The Gdx.app.postRunnable API is generally used so background threads can ask for something to happen on the render thread. You want to post a Runnable to execute anywhere but the render thread.

As long as your Stats code doesn't interact with OpenGL context at all (since Android OpenGL APIs assume only a single thread interacts with them), you can just post your Runnable on a new background thread:

new Thread(new Runnable() { ... }).start();

This should unblock your render. (Of course, if your background thread uses a lot of CPU, it can still interfere with the render thread, but if its mostly doing blocking IO or host has spare cores, it shouldn't interfere.)

This could be improved in lots of ways (using a ThreadPool, or using Android-aware background task support), but if your stats update is relatively quick and the thread creation isn't frequent this should work fine.

like image 68
P.T. Avatar answered Oct 25 '25 10:10

P.T.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!