user2494863
user2494863

Reputation: 461

Unity3d Parse FindAsync method freezes UI

I'm running a simple Parse FindAsync method as show below (on Unity3d):

        Task queryTask = query.FindAsync();
        Debug.Log("Start");
        Thread.Sleep(5000);
        Debug.Log("Middle");
        while (!queryTask.IsCompleted) {
                Debug.Log("Waiting");
                Thread.Sleep(1);
        }
        Debug.Log("Finished");

I'm running this method on a separate thread and I put a load circle on UI. My load freezes (+- 1 second) somewhere in the middle of the Thread.sleep method. It's look like when findAsync finishes the process it freezes the UI until it complete their job. Is there anything I could do?

Ps: This works perfectly on editor, the problem is on Android devices.

Ps2: I'm running parse 1.4.1

Ps3: I already tried the continueWith method, but the same problem happens.

Upvotes: 2

Views: 358

Answers (2)

Kryptos
Kryptos

Reputation: 875

Making the thread sleep might not be a good idea, mainly because the number of threads available is different on each device.

Unity as a built-in scheduler that uses coroutines, so it is better to use it.

IEnumerator RunSomeLongLastingTask()
{
    Task queryTask = query.FindAsync();
    while (!queryTask.IsCompleted)
    {
        Debug.Log("Waiting"); // consider removing this log because it also impact performance
        yield return null; // wait until next frame
    }
}

Now, one possible issue is if your task take too much CPU, then the UI will still not be responsive. If possible, try to give a lower priority to this task.

Upvotes: 2

David
David

Reputation: 16277

IEnumerator RunSomeLongLastingTask () {

    Task queryTask = query.FindAsync();
    Debug.Log("Start");
    //Thread.Sleep(5000); //Replace with below call
    yield WaitForSeconds(5); //Try this

    Debug.Log("Middle");
    while (!queryTask.IsCompleted) {
        Debug.Log("Waiting");
        //Thread.Sleep(1);
        yield WaitForSeconds(0.001f);
    }
    Debug.Log("Finished");
}

To call this function, use:

StartCoroutine(RunSomeLongLastingTask());

Upvotes: 2

Related Questions