当前位置:主页 > 移动开发 > Android代码 >

详解Android App中的AsyncTask异步任务执行方式

时间:2021-01-30 10:23:26 | 栏目:Android代码 | 点击:

基本概念

AsyncTask:异步任务,从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件。通过AsyncTask我们可以轻松的解决多线程之间的通信问题。

怎么来理解AsyncTask呢?通俗一点来说,AsyncTask就相当于Android给我们提供了一个多线程编程的一个框架,其介于Thread和Handler之间,我们如果要定义一个AsyncTask,就需要定义一个类来继承AsyncTask这个抽象类,并实现其唯一的一个 doInBackgroud 抽象方法。要掌握AsyncTask,我们就必须要一个概念,总结起来就是: 3个泛型,4个步骤。

3个泛型指的是什么呢?我们来看看AsyncTask这个抽象类的定义,当我们定义一个类来继承AsyncTask这个类的时候,我们需要为其指定3个泛型参数:

AsyncTask <Params, Progress, Result>

 我们在定义一个类继承AsyncTask类的时候,必须要指定好这三个泛型的类型,如果都不指定的话,则都将其写成Void,例如:

AsyncTask <Void, Void, Void>
4个步骤:当我们执行一个异步任务的时候,其需要按照下面的4个步骤分别执行

为什么我们的AsyncTask抽象类只有一个 doInBackground 的抽象方法呢??原因是,我们如果要做一个异步任务,我们必须要为其开辟一个新的Thread,让其完成一些操作,而在完成这个异步任务时,我可能并不需要弹出要给ProgressDialog,我并不需要随时更新我的ProgressDialog的进度条,我也并不需要将结果更新给我们的UI界面,所以除了doInBackground 方法之外的三个方法,都不是必须有的,因此我们必须要实现的方法是 doInBackground 方法。

 实例
下面实现一个打开网络图片的demo:

package com.app.main;
 
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
 
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
 
public class Main extends Activity {
 
  String url = "http://e.hiphotos.baidu.com/image/w%3D2048/sign=61711bd121a446237ecaa262ac1a730e/e850352ac65c10385f10af69b3119313b07e892a.jpg";
  ImageView imgView = null;
  Button btn = null;
  ProgressDialog dialog = null;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
 
    imgView = (ImageView) this.findViewById(R.id.imageview);
    btn = (Button) this.findViewById(R.id.btn);
    dialog = new ProgressDialog(this);
    dialog.setMessage("下载图片中......");
 
    btn.setOnClickListener(new OnClickListener() {
 
      @Override
      public void onClick(View view) {
 
        new MyTask().execute(url);
      }
 
    });
 
  }
 
  class MyTask extends AsyncTask<String, Void, Bitmap> {
 
    @Override
    protected void onPreExecute() {
 
      super.onPreExecute();
 
      dialog.show();
 
    }
 
    @Override
    protected Bitmap doInBackground(String... params) {
 
      Bitmap bitmap = null;
 
      String url = params[0];
 
      HttpClient client = new DefaultHttpClient();
 
      HttpGet getMethod = new HttpGet(url);
 
      try {
 
        HttpResponse response = client.execute(getMethod);
 
        if (response.getStatusLine().getStatusCode() == 200) {
          HttpEntity entity = response.getEntity();
 
          byte[] data = EntityUtils.toByteArray(entity);
 
          bitmap = BitmapFactory
              .decodeByteArray(data, 0, data.length);
 
        }
 
      } catch (Exception e) {
 
      }
 
      return bitmap;
    }
 
    @SuppressLint("NewApi")
    @Override
    protected void onPostExecute(Bitmap result) {
 
      super.onPostExecute(result);
 
      imgView.setImageBitmap(result);
 
      dialog.dismiss();
    }
 
  }
 
}

实现的效果如图:

2016422172857672.png (135×240)

您可能感兴趣的文章:

相关文章