Introduction
Thread
- One is providing a new class that extends Thread and overriding it's run() method.
- The other is providing a new Thread instance with a Runnable object during its creation.
A thread can be executed by calling its "start" method. You can set the "Priority" of a thread by calling its "setPriority(int)" method.
A thread can be used if you have no effect in the UI part. For example, you are calling some web service or download some data, and after download, you are displaying it to your screen. Then you need to use a Handler with a Thread and this will make your application complicated to handle all the responses from Threads.
A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each thread has each message queue. (Like a To do List), and the thread will take each message and process it until the message queue is empty. So, when the Handler communicates, it just gives a message to the caller thread and it will wait to process.
If you use Java threads then you need to handle the following requirements in your own code:
- Synchronization with the main thread if you post back results to the user interface
- No default for canceling the thread
- No default thread pooling
- No default for handling configuration changes in Android
AsyncTask
- onPreExecute()
Invoked on the UI thread before the task is executed
- doInbackground(Params..)
Invoked on the background thread immediately after onPreExecute() finishes executing.
- onProgressUpdate(Progress..)
Invoked on the UI thread after a call to publishProgress(Progress...).
- onPostExecute(Result)
Invoked on the UI thread after the background computation finishes.
Why should you use AsyncTask?
- Easy to use for a UI Thread. (So, use it when the caller thread is a UI thread).
- No need to manipulate Handlers.
Example
- private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
- ImageView bmImage;
- ProgressDialog pd;
- Context mContext;
- public DownloadImageTask(Context context,ImageView bmImage) {
- this.bmImage = bmImage;
- mContext = context;
- }
- public void onPreExecute() {
- pd = ProgressDialog.show(mContext, "Downloading","Downloading..Please Wait", true);
- }
- public void onPostExecute(Bitmap result) {
- pd.dismiss();
- if(result!=null){
- bmImage.setImageBitmap(result);
- }
- }
- protected Bitmap doInBackground(String... urls) {
- String urldisplay = urls[0];
- Bitmap bitmap = null;
- try {
- InputStream in = new java.net.URL(urldisplay).openStream();
- bitmap = BitmapFactory.decodeStream(in);
- } catch (Exception e) {
- Log.e("Error", e.getMessage());
- e.printStackTrace();
- }
- return bitmap;
- }
- }
You can see that, before starting background work, the progress dialog is shown to the user and after completion of background work the progress dialog is dismissed in "onPostExecute". So you can do UI changes in the same class implementation without using Handler and message passing.
To use this class, you need to write the following line:
- new DownloadImageTask (Activity.this, sourceImageView).execute(url1);

Comments
Join the conversation! Your thoughts help the community grow.