博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Android】Android中AsyncTask的定义和使用方法
阅读量:6039 次
发布时间:2019-06-20

本文共 6352 字,大约阅读时间需要 21 分钟。

AsyncTask介绍
Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。
首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。

Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。

AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。

MainActivity.Java

package com.example.asyncdemo;import java.net.URI;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 android.os.AsyncTask;import android.os.Bundle;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.ProgressBar;import android.widget.Toast;public class MainActivity extends Activity {    private Button mDownloadBtn;    private Button mCancelBtn;    private ImageView mImage1;    private ImageView mImage2;    private ProgressBar mProgress1;    private ProgressBar mProgress2;    private GetLogoFromInternet mTask;    private String TAG = "GetLogoFromInternet";    // 一个异步任务的执行一般包括以下几个步骤:    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initComponent();    }    private void initComponent() {        mDownloadBtn = (Button) findViewById(R.id.button1);        mDownloadBtn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                mTask = new GetLogoFromInternet();                // 1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。                mTask.execute(                        "http://d.hiphotos.baidu.com/image/pic/item/caef76094b36acaf8ded6c2378d98d1000e99ce4.jpg",                        "http://e.hiphotos.baidu.com/image/pic/item/00e93901213fb80e2f00716233d12f2eb83894b5.jpg");            }        });        mCancelBtn = (Button) findViewById(R.id.button2);        mCancelBtn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                mTask.cancel(true);            }        });        mImage1 = (ImageView) findViewById(R.id.imageView1);        mImage2 = (ImageView) findViewById(R.id.imageView2);        mProgress1 = (ProgressBar) findViewById(R.id.progressBar1);        mProgress2 = (ProgressBar) findViewById(R.id.progressBar2);    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.main, menu);        return true;    }    class GetLogoFromInternet extends AsyncTask
{ private Bitmap bitmap = null; // 2.onPreExecute(),在execute(Params...params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。 //onPreExecute方法用于在执行后台任务前做一些UI操作 @Override protected void onPreExecute() { mImage1.setImageBitmap(null); mImage2.setImageBitmap(null); mProgress1.setProgress(0); mProgress2.setProgress(0); Log.e(TAG, "onPreExecute"); } // 3.doInBackground(Params...params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。 // 在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。 @Override protected Bitmap doInBackground(String... params) { publishProgress(0, 0); HttpClient hc = new DefaultHttpClient(); publishProgress(30, 0); HttpGet hg = new HttpGet(); Bitmap bitmap2 = null; try { hg.setURI(new URI(params[0])); HttpResponse response = hc.execute(hg); bitmap = BitmapFactory.decodeStream(response.getEntity() .getContent()); publishProgress(100, 30); hg.setURI(new URI(params[1])); HttpResponse response2 = hc.execute(hg); bitmap2 = BitmapFactory.decodeStream(response2.getEntity() .getContent()); } catch (Exception e) { Log.e(TAG, "" + e.getMessage()); } publishProgress(100, 100); Log.e(TAG, "doInBackground"); // mImage1.setImageBitmap(bitmap);//error return bitmap2; } // 4.onProgressUpdate(Progress... values),在调用publishProgress(Progress...values)时, // 此方法被执行,直接将进度信息更新到UI组件上。 @Override protected void onProgressUpdate(Integer... values) { mProgress1.setProgress(values[0]); mProgress2.setProgress(values[1]); Log.e(TAG, "onProgressUpdate"); } // 5.onPostExecute(Result result),当后台操作结束时, // 此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。 @Override protected void onPostExecute(Bitmap result) { if (result != null) { mImage1.setImageBitmap(bitmap); mImage2.setImageBitmap(result); Toast.makeText(MainActivity.this, "get image from network successful", Toast.LENGTH_SHORT) .show(); } else { Toast.makeText(MainActivity.this, "get image from network error", Toast.LENGTH_SHORT) .show(); } Log.e(TAG, "onPostExecute"); } //onCancelled方法用于在取消执行中的任务时更改UI @Override protected void onCancelled() { mProgress1.setProgress(0); mProgress2.setProgress(0); Log.e(TAG, "onCancelled"); } } // 在使用的时候,有几点需要格外注意: // 1.异步任务的实例必须在UI线程中创建。 // 2.execute(Params... params)方法必须在UI线程中调用。 // 3.不要手动调用onPreExecute(),doInBackground(Params... // params),onProgressUpdate(Progress... values),onPostExecute(Result // result)这几个方法。 // 4.不能在doInBackground(Params... params)中更改UI组件的信息。 // 5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。}

activity_main.xml

AndroidManifest.xml

 

下载地址:

转载于:https://www.cnblogs.com/xubuhang/p/4503913.html

你可能感兴趣的文章
HTMLHelper
查看>>
快速构建Windows 8风格应用29-捕获图片与视频
查看>>
OC语言Block和协议
查看>>
使用xpath时出现noDefClass的错误(找不到某个类)
查看>>
.Net规则引擎介绍 - REngine
查看>>
CSS3 transforms 3D翻开
查看>>
利用传入的Type类型来调用范型方法的解决方案
查看>>
Top命令内存占用剖析
查看>>
转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
查看>>
求带分数(蓝桥杯)
查看>>
Bootstrap系列 -- 11. 基础表单
查看>>
Retrofit 入门学习
查看>>
Spring Boot学习笔记
查看>>
python3存入redis是bytes
查看>>
laravel 集合接口
查看>>
C/C++二进制读写png文件
查看>>
thymleaf 常用th 标签
查看>>
RTB 广告系统
查看>>
Linux signal 那些事儿(2)【转】
查看>>
InfluxDB安装及配置
查看>>