首页 > 网站 > 建站经验 > 正文

Android:多线程之AsyncTask

2019-11-02 15:23:15
字体:
来源:转载
供稿:网友

 AsyncTask

  AsyncTask,异步任务,可以简单进行异步操作,并把执行结果发布到UI主线程。AsyncTask是一个抽象类,它的内部其实也是结合了Thread和Handler来实现异步线程操作,但是它形成了一个通用线程框架,更清晰简单。AsyncTask应该被用于比较简短的操作(最多几秒钟)。如果需要保持长时间运行的线程,可以使用ThreadPooExecutor或者FutureTask,关于这两个类的内容,以后再介绍,本片博客主要介绍AsyncTask。

  AsyncTask被定义为一个操作,运行在一个后台线程中,其结果被发布在UI线程上。它的异步工作的参数与返回值被泛型的三个参数指定:Params、Progress、Result。AsyncTask将经历4个步骤:onPreExecute、doInBackground、onProgressUpdate、onPostExecute。下面详细讲解这三个参数与四个步骤:

  三个泛型参数:

Params:被发送到执行任务的参数类型。 Progress:进度的类型,发送后台的计算进度到UI线程类型。 Result:异步任务的返回结果类型。

  一个异步任务将经历四个阶段:

onPreExecute():执行在UI线程上调用执行任务之前,一般用于设置任务。 doInBackground(Params...):主要是用来执行异步任务的耗时操作,可以在这个方法中通过publishProgress()方法发布进度信息,并在执行完成之后,返回执行结果。 onProgreddUpdate(Progress...):在UI线程上接受doInBackground()传递过来的进度信息,并在UI线程上展示进度信息,它执行的时机是不确定的。 onPostExecute(Result):在UI线程上操作doInBackground()执行的返回值。

  上面介绍的四个步骤的示意图:

AsyncTask取消任务

  在程序的任何位置,都可以通过cancel(boolean)方法进行取消任务,当取消任务之后,会改变isCancelled()的返回值,使其返回true。之后会调用onCancelled(Object)方法,替代onPostExecute()得到doInBackground()的返回结果。在运行中,可以经常通过isCancelled()方法查看任务是否被取消。

 

AsyncTask的使用规则

  使用AsyncTask必须遵循以下规则:

%20%20%20%20AsyncTask必须声明在UI线程上。%20%20%20%20AsyncTask必须在UI线程上实例化。%20%20%20%20必须通过execute()方法执行任务。%20%20%20%20不可以直接调用onPreExecute()、onPostExecute(Resut)、doInBackground(Params...)、onProgressUpdate(Progress...)方法。%20%20%20%20可以设置任务只执行一次,如果企图再次执行会报错。

示例

  一个简单的示例,通过AsyncTask下载一个网络上的图片,下载的时候展示一个等待框,并显示在一个ImageView中。

  实现代码:

%201%20package%20com.bgxt.datatimepickerdemo;%202%20%203%20import%20org.apache.http.HttpEntity;%204%20import%20org.apache.http.HttpResponse;%205%20import%20org.apache.http.client.HttpClient;%206%20import%20org.apache.http.client.methods.HttpGet;%207%20import%20org.apache.http.impl.client.DefaultHttpClient;%208%20import%20org.apache.http.util.EntityUtils;%209%2010%20import%20android.app.Activity;11%20import%20android.app.ProgressDialog;12%20import%20android.graphics.Bitmap;13%20import%20android.graphics.BitmapFactory;14%20import%20android.os.AsyncTask;15%20import%20android.os.Bundle;16%20import%20android.view.View;17%20import%20android.widget.Button;18%20import%20android.widget.ImageView;19%2020%20public%20class%20AsyncTaskActivity1%20extends%20Activity%20{21%20%20%20%20%20private%20Button%20btnDown;22%20%20%20%20%20private%20ImageView%20ivImage;23%20%20%20%20%20private%20static%20String%20image_path%20=%20"http://ww4.sinaimg.cn/bmiddle/786013a5jw1e7akotp4bcj20c80i3aao.jpg";24     private ProgressDialog dialog;25 26     @Override27     protected void onCreate(Bundle savedInstanceState) {28         // TODO Auto-generated method stub29         super.onCreate(savedInstanceState);30         setContentView(R.layout.asynctask_activity);31 32         btnDown = (Button) findViewById(R.id.btnDown);33         ivImage = (ImageView) findViewById(R.id.ivSinaImage);34         35         // 声明一个等待框以提示用户等待36         dialog=new ProgressDialog(this);37         dialog.setTitle("提示信息");38         dialog.setMessage("正在下载,请稍后...");39         40         btnDown.setOnClickListener(new View.OnClickListener() {41 42             @Override43             public void onClick(View v) {44                 // 执行一个异步任务,并把图片地址以参数的形式传递进去45                 new MyTask().execute(image_path);46             }47         });48     }49 50     // 以String类型的参数,Void表示没有进度信息,Bitmap表示异步任务返回一个位图51     public class MyTask extends AsyncTask<String, Void, Bitmap> {52         // 表示任务执行之前的操作53         @Override54         protected void onPreExecute() {55             super.onPreExecute();56             //显示等待框57             dialog.show();58         }59 60         //主要是完成耗时操作61         @Override62         protected Bitmap doInBackground(String... params) {63             HttpClient httpClient=new DefaultHttpClient();64             HttpGet httpGet=new HttpGet(params[0]);65             Bitmap bitmap=null;66             try {67                 //从网络上下载图片68                 HttpResponse httpResponse =httpClient.execute(httpGet);69                 if(httpResponse.getStatusLine().getStatusCode()==200){70                     HttpEntity httpEntity = httpResponse.getEntity();71          
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表