Start Async Task within a worker thread

13,423

Solution 1

From the Android AsyncTask doc:

"The task instance must be created on the UI thread.", and

"execute(Params...) must be invoked on the UI thread."

So I think the answer to your first question is "no". As far as the second, those methods are all invoked on the UI thread, but it's a bit moot.

EDIT: I'm not sure if those are absolute restrictions, or strong suggestions, but in both cases, I'd recommend following them.

Solution 2

Just for the Record: If you start a AsyncTask outside the UI-Thread the onPreExecute will not be executed from the UI-Thread (but from the caller Thread). This will lead to an exception. However the onPostExecute Method will always be executed on the UI-Thread. Hope to help someone :)

Solution 3

According to Android doco you must run an AsyncTask from a UI thread, but in reality it depends on who runs this line in AsyncTask.class first:

private static final InternalHandler sHandler = new InternalHandler();

If you have an AsyncTask that is called on from both UI and worker thread, you might get around this restriction with calling it first from UI thread. If you hit it first from your worker thread you're doomed. I'd rather not rely on this as implementation details can change at any time, but this knowledge is useful if you, like me, wondered "why my other AsyncTask works".

Solution 4

From the Android AsyncTask doc:

"The task instance must be created on the UI thread.", and

"execute(Params...) must be invoked on the UI thread."

So, the following is legal.

new Thread(new Runnable() {
                @Override
                public void run() {
                    // do some work here

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            new MyAsyncTask(ctx).execute(); 
                        }
                    });
                }
            }).start();
Share:
13,423
amp
Author by

amp

Updated on June 05, 2022

Comments

  • amp
    amp almost 2 years

    I have two questions:

    • Can we start/execute an Async Task within a worker thread?
    • If yes, the methods onPreExecute(), onProgressUpdate(Progress...) and onPostExecute(Result) are invoked on the UI thread?

    I wanna know that because I have a TCP connection running on a worker thread and when a packet is received I wanna start a new thread to make the parse of this packet and after that refresh some data structures on the UI thread.

    Thanks in advance!

  • Cipi
    Cipi over 8 years
    This is pointless, so -1. You are starting a thread from a main thread, that delegates running a task to the main thread... Same thing would be if you just run new MyAsyncTask(ctx).execute(); instead of all that pointless code.
  • Gustavo Maciel
    Gustavo Maciel about 7 years
    @Cipi I guess he was just pointing that you can call runOnUiThread from inside any worker thread. (since the comment //do some work here)