I was wondering is it ok to execute a
In principle, there's no problem with starting a thread in the
doInBackground() of an
AsyncTask, but sometimes you see this done not because it's the right thing to do, but because of a misunderstanding about how
The point is that
doInBackground() will automatically get executed on a background (non-GUI) thread, without you needing to create a thread for it yourself. That, in fact, is the whole point of an
AsyncTask. So if you have a simple, linear task that you want executed in the background, you do it with an
AsyncTask, and you don't need to do any manual thread creation.
Where you might want to start a new thread in an
AsyncTask is if you want your background task to use multiple threads to complete. Suppose that you were writing an app to check the online status of various servers, and display something about their status on the screen. You'd use an
AsyncTask to do the network access in the background; but if you did it in a naive way, you'd end up with the servers being pinged one by one, which would be rather slow (especially if one was down, and you needed to wait for a timeout). The better option would be to make sure that each server was dealt with on its own background thread. You'd then have a few options, each of which would be defensible:
AsyncTaskfor each server.
doInBackground()of your single
AsyncTask, and then make sure that
doInBackground()doesn't complete until all the individual threads have completed (use
ThreadPool/ some kind of
ExecutorService/ a fork/join structure inside your single
AsyncTask, to manage the threads for you.
I would say that with modern libraries there is rarely a need for manual thread creation. Library functions will manage all of this for you, and take some of the tedium out of it, and make it less error-prone. The third option above is functionally equivalent to the second, but just uses more of the high-level machinery that you've been given, rather than going DIY with your thread creation.
I'm not saying that threads should never be created manually, but whenever you're tempted to create one, it's well worth asking whether there's a high-level option that will do it for you more easily and more safely.