Difference Between Thread and AsyncTask in Android

本文对比了Thread与AsyncTask在Android应用开发中的不同用途。Thread适用于后台任务且不影响UI更新,而AsyncTask简化了UI线程操作,无需手动管理线程和Handler。通过示例展示了如何使用AsyncTask下载图片并更新UI。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

What is difference between Thread and AsyncTask? When to use Thread and when to use AsyncTask?

In any higher programming language, there is concept of multi-tasking. Basically the user needs to run some portion of code without user interaction. A thread is generally developed for that. But in Android, multi-tasking can be done by any of the three methods Thread, Service and AsyncTask. I am currently giving you what is difference between Thread and AsyncTask.

Thread

A thread is a concurrent unit of execution. It has its own call stack. There are two methods to implement threads in applications.

  1. One is providing a new class that extends Thread and overriding its run() method.
  2. 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 affect 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

AsyncTask enables proper and easy use of the UI thread. This class allows performing background operations and publishing results on the UI thread without having to manipulate threads and/or handlers. An asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread. 

AsyncTask will go through the following 4 stages:

  1. onPreExecute()

    Invoked on the UI thread before the task is executed
     
  2. doInbackground(Params..)

    Invoked on the background thread immediately after onPreExecute() finishes executing.
     
  3. onProgressUpdate(Progress..)

    Invoked on the UI thread after a call to publishProgress(Progress...).
     
  4. onPostExecute(Result)

    Invoked on the UI thread after the background computation finishes.

Why should you use AsyncTask?

  1. Easy to use for a UI Thread. (So, use it when the caller thread is a UI thread).
  2. 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);

Summary

In this article, we learned what the differences between Thread and AsyncTask are. Which is better for which condition. It's now clear when to use Thread and when to use AsyncTask.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值