android – Start Async Task within a worker thread-ThrowExceptions

Exception or error:

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!

How to solve:

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.

###

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 🙂

###

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”.

###

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();

###

In simple, we can start AsyncTask in a worker. You can just execute a AsyncTask in a new Thread, very simple.
The reason is in the Android source code:
[clike here]

private static class InternalHandler extends Handler {
    public InternalHandler() {
        super(Looper.getMainLooper());
    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *