详解Android 中AsyncTask 的使用
发布时间 - 2026-01-11 03:04:00 点击率:次详解Android 中AsyncTask 的使用

1、首先我们来看看AsyncTask 的介绍:
Handler 和 AsyncTask 都是android 中用来实现异步任务处理的方式;其中:
Handler 实例向 UI 线程发送消息,完成界面更新,
优点:对整个过程控制的比较精细;
缺点:代码相对臃肿,多个任务同时执行时,不易对线程进行精确的控制;
AsyncTask :比Handler 更轻量级一些,适用于简单的异步处理;
优点:简单 | 快捷 | 过程可控;
缺点:使用多个异步操作时就变得复杂起来;
2、AsyncTask 的定义:(AsyncTask 定义了三种泛型类型)
public abstract class AsyncTask<Params,Progress,Result>{...}
说明:
Params :启动任务执行的输入参数,例如:HTTP 请求的URL;
Progress: 后台任务执行的百分比;
Result:后台执行任务最终返回的结果,比如String;
3、AsyncTask 异步任务的执行步骤:(以下方法除execute(Params... params),在AsyncTask中重写),下列是相关方法的介绍:
A、execute(Params... params) :
执行一个异步任务,需要我们在UI线程中调用,触发任务
B、OnPreExecute():
execute(Params... params)调用后立即执行,一般用于在执行后台任务前对UI做一些标记; 例如,可以在此处显示进度对话框;
C、doInBackground(Params.. params):
onPreExecute() 完成后执行,后台执行,处理比较耗时的操作;此处不能操作UI,执行的过程中调用publishProgress(Progress... values)来更新进度信息;
D、onProgressUpdate(Progress... values):
在调用publicshProgress(Progress... values)方法执行,直接将进度信息更新到UI组建上;此方法在主线程上执行,用于显示任务执行的进度;
E、onPostExecute(Result result):
此方法在主线程中执行,当后台的操作结束时,此方法会被调用,计算结果作为参数传递到此方法中,直接将结果显示到UI组建上。
F、cancel(); :
取消一个正在执行的任务,在UI线程中完成,用AsyncTask的对象进行调用,参数为true/false;
4、使用AsyncTask 时注意事项:
A、异步任务实例必须在UI线程中创建;
B、execute(Params... params) 方法必须在UI线程中调用;
C、不要手动的调onPreExecute().doInBackground().onProgressUpdate().onPostExecute()这几个方法;
D、不能在doInBackground(Params... params) 中更改组件信息;
E、一个任务实例只能执行一次,如果执行第二次会抛出异常;
5、案例:使用AsyncTask 实现图片的下载:
Activity类,主程序的入口:
public class MainActivity extends Activity {
// 程序入口
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyAsyncTask my = new MyAsyncTask();
my.execute("http://photocdn.sohu.com/20110927/Img320705637.jpg");
}
}
AsyncTask 派生类,实现异步任务:
package com.sun.asynctask;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.http.HttpConnection;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
/**
* 异步任务,实现网页内容的获取
*
*
* 生成该类的对象,并调用execute方法之后
*
* 首先执行的是onProExecute() 方法,
*
* 其次执行的doInBackground()方法
*/
public class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {
/**
* 在execute() 方法执行后立即执行,运行在UI线程中,
* 在后台任务开始前执行,用于标识UI界面
*/
protected void onPreExecute() {
super.onPreExecute();
Log.i("msg","onPreExecute()...");
}
/**
* 后台执行耗时的任务;
*
* 方法中的 String 参数对应 AsyncTask的第一个参数;
* 返回的 Bitmap 对应的是AsyncTask 的第三个参数;
*
* 该方法并不运行在UI线程中,主要用于异步操作,可以调用publishProgress()方法触发
* onProgressUpdate对UI进行操作;
*
*/
protected Bitmap doInBackground(String... params) {
Log.i("msg","doInBackground(String... params)...");
try {
/* 网络访问方式 二 */
/*
URL url = new URL(params[0]);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.connect(); // 开始连接
int zong = connection.getContentLength();
InputStream is2 = connection.getInputStream();
*/
/* 开始网络访问数据 */
HttpGet hg = new HttpGet(params[0]); // 此处注意参数的用法
HttpClient hc = new DefaultHttpClient();
HttpResponse hr = hc.execute(hg); // 发送请求,得到响应
// 判断请求是否成功
if(hr.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
Log.i("msg", "access success...");
HttpEntity he = hr.getEntity();
InputStream is = he.getContent(); // 获取输入流对象,好比搭桥
long total = he.getContentLength(); // 文件的总字节数
ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 输出流,临时容器,用于装从is中流出的数据
byte[] buffer = new byte[1024]; // 缓存容器,每次装载1024 个字节数据
int len = 0; // 每次读的字节数
int curLen = 0 ; // 已读多少数据
while((len=is.read(buffer))!=-1){ // 当len !=-1 时,也就是还有数据可读
Log.i("msg","begin read data..."+len+",total:"+total);
baos.write(buffer, 0, len); // 向临时容器中装数据
curLen=curLen+len; // 更新已读的数据
/* 在UI显示当前读取的进度 , 调用次方法触发onProgressUpdate() 方法执行 */
publishProgress((int)(((float)curLen/total)*100));
}
Bitmap bitmap = BitmapFactory.decodeByteArray(baos.toByteArray(), 0, (int)total);
is.close();
return bitmap;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 括号中的参数:String 对应的是AsyncTask 的第三个参数,也就是
* 接收了 从doInBackground() 返回的结果;
* 此方法在 doInBackground() 方法执行结束后执行,运行在UI线程中,
* 可以对UI进行更新
*/
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
Log.i("msg","onPostExecute(String result)..."+result.getHeight());
}
/**
* 方法括号中的Integer 对应AsyncTask 中的第二个参数;
* 在doInBackground() 中每次调用publishProgress() 时被执行;
* 该方法是在UI线程中的,所以可以用于对UI进行更新
*/
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.i("msg","onProgressUpdate(Integer... values)..."+values[0]);
}
/**
* 图片的下载
*/
public HttpURLConnection downPic(String urltemp){
try {
URL url = new URL(urltemp); // 确定连接地址
// 打开一个连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect(); // 开始连接
return connection;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
以上就是Android AsyncTask的应用实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# AsyncTask
# AsyncTask的详解
# AsyncTask实例
# Android 使用AsyncTask实现多线程断点续传
# Android 使用AsyncTask实现断点续传
# Android 使用AsyncTask实现多任务多线程断点续传下载
# Android多线程AsyncTask详解
# Android中使用AsyncTask实现下载文件动态更新进度条功能
# Android AsyncTask详解及使用方法
# Android AsyncTask实现异步处理任务的方法详解
# Android带进度条的下载图片示例(AsyncTask异步任务)
# 浅谈Android中AsyncTask的工作原理
# 的是
# 多个
# 第三个
# 已读
# 都是
# 是在
# 第一个
# 如有
# 主程序
# 适用于
# 能在
# 希望能
# 第二个
# 三种
# 来看看
# 重写
# 时就
# 谢谢大家
# 这几个
# 到此
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
大型企业网站制作流程,做网站需要注册公司吗?
网站制作报价单模板图片,小松挖机官方网站报价?
轻松掌握MySQL函数中的last_insert_id()
,网页ppt怎么弄成自己的ppt?
北京企业网站设计制作公司,北京铁路集团官方网站?
如何在建站之星网店版论坛获取技术支持?
详解Android——蓝牙技术 带你实现终端间数据传输
创业网站制作流程,创业网站可靠吗?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
什么是javascript作用域_全局和局部作用域有什么区别?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel中的withCount方法怎么高效统计关联模型数量
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
魔毅自助建站系统:模板定制与SEO优化一键生成指南
香港服务器WordPress建站指南:SEO优化与高效部署策略
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
如何为不同团队 ID 动态生成多个非值班状态按钮
如何用AWS免费套餐快速搭建高效网站?
JavaScript如何实现倒计时_时间函数如何精确控制
详解vue.js组件化开发实践
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Swift中循环语句中的转移语句 break 和 continue
如何在局域网内绑定自建网站域名?
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
Laravel如何使用模型观察者?(Observer代码示例)
成都网站制作公司哪家好,四川省职工服务网是做什么用?
网站制作软件有哪些,制图软件有哪些?
Laravel如何处理和验证JSON类型的数据库字段
网站页面设计需要考虑到这些问题
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
专业商城网站制作公司有哪些,pi商城官网是哪个?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel怎么在Controller之外的地方验证数据
Laravel distinct去重查询_Laravel Eloquent去重方法
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
详解MySQL数据库的安装与密码配置
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
使用spring连接及操作mongodb3.0实例
如何快速搭建高效香港服务器网站?
Bootstrap整体框架之JavaScript插件架构
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
Laravel如何升级到最新版本?(升级指南和步骤)

