I have two questions:
- Can we start/execute an Async Task within a worker thread?
- If yes, the methods
onPreExecute()
,onProgressUpdate(Progress...)
andonPostExecute(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!
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.
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:
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".
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 :)
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]
So, the following is legal.