android异步任务框架,详解Android App中的AsyncTask异步任务执行方式
基本概念
AsyncTask:异步任务,从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件。通过AsyncTask我们可以轻松的解决多线程之间的通信问题。
怎么来理解AsyncTask呢?通俗一点来说,AsyncTask就相当于Android给我们提供了一个多线程编程的一个框架,其介于Thread和Handler之间,我们如果要定义一个AsyncTask,就需要定义一个类来继承AsyncTask这个抽象类,并实现其唯一的一个 doInBackgroud 抽象方法。要掌握AsyncTask,我们就必须要一个概念,总结起来就是: 3个泛型,4个步骤。
3个泛型指的是什么呢?我们来看看AsyncTask这个抽象类的定义,当我们定义一个类来继承AsyncTask这个类的时候,我们需要为其指定3个泛型参数:
AsyncTask
Params: 这个泛型指定的是我们传递给异步任务执行时的参数的类型
Progress: 这个泛型指定的是我们的异步任务在执行的时候将执行的进度返回给UI线程的参数的类型
Result: 这个泛型指定的异步任务执行完后返回给UI线程的结果的类型
我们在定义一个类继承AsyncTask类的时候,必须要指定好这三个泛型的类型,如果都不指定的话,则都将其写成Void,例如:
AsyncTask
4个步骤:当我们执行一个异步任务的时候,其需要按照下面的4个步骤分别执行
onPreExecute(): 这个方法是在执行异步任务之前的时候执行,并且是在UI Thread当中执行的,通常我们在这个方法里做一些UI控件的初始化的操作,例如弹出要给ProgressDialog
doInBackground(Params... params): 在onPreExecute()方法执行完之后,会马上执行这个方法,这个方法就是来处理异步任务的方法,Android操作系统会在后台的线程池当中开启一个worker thread来执行我们的这个方法,所以这个方法是在worker thread当中执行的,这个方法执行完之后就可以将我们的执行结果发送给我们的最后一个 onPostExecute 方法,在这个方法里,我们可以从网络当中获取数据等一些耗时的操作
onProgressUpdate(Progess... values): 这个方法也是在UI Thread当中执行的,我们在异步任务执行的时候,有时候需要将执行的进度返回给我们的UI界面,例如下载一张网络图片,我们需要时刻显示其下载的进度,就可以使用这个方法来更新我们的进度。这个方法在调用之前,我们需要在 doInBackground 方法中调用一个 publishProgress(Progress) 的方法来将我们的进度时时刻刻传递给 onProgressUpdate 方法来更新
onPostExecute(Result... result): 当我们的异步任务执行完之后,就会将结果返回给这个方法,这个方法也是在UI Thread当中调用的,我们可以将返回的结果显示在UI控件上
为什么我们的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 {
@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();
}
}
}
实现的效果如图:
android异步任务框架,详解Android App中的AsyncTask异步任务执行方式相关推荐
- android常用技术网站收藏过的网址 给 Android 开发者的 RxJava 详解 Android设备标识-没有完美的解决方案-只有取舍 - 小彼得的专栏 - 博客频道 - CSDN.NET
收藏过的网址 http://www.jianshu.com/p/a7b36d682b6f?ref=myread Android插件化快速入门与实例解析 http://www.cnblogs.com/ ...
- php图片涂鸦,IOS_详解iOS App中图片的线段涂鸦功能的添加方法,接下来我们要讲图片的涂鸦, - phpStudy...
详解iOS App中图片的线段涂鸦功能的添加方法 接下来我们要讲图片的涂鸦,我们分开一点一点拓展,先给图片上划线 创建项目 起名testAddLine 接下来我们在默认生成的ViewControlle ...
- java按钮权限控制_详解Spring Security 中的四种权限控制方式
Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...
- android uri图片压缩,详解android 通过uri获取bitmap图片并压缩
详解android 通过uri获取bitmap图片并压缩 很多人在调用图库选择图片时会在onactivityresult中用media.getbitmap来获取返回的图片,如下: uri mimage ...
- android:stretchcolumns=quot;*quot;,详解Android TableLayout中stretchColumns、shrinkColumns的用法...
详解Android 中TableLayout中stretchColumns.shrinkColumns的用法 android:stretchColumns="1" android: ...
- android led闪烁功能,详解Android应用层制作LED指示灯
详解Android应用层制作LED指示灯 在Java应用层修改LED指示灯的颜色,这个花了我半天时间, 才实现该功能! public class LEDActivity extends Activit ...
- android任务 进程 线程详解,Android任务、进程、线程详解
singleTop模式,基本上于standard分歧,仅正在请求的Activity反好位于栈顶时,无所区别.此时,配放成singleTop的Activity,不再会构制新的实例加入到Task栈外,而是 ...
- Android编程之SparseArrayE详解
Android编程之SparseArrayE详解
Android编程之SparseArray<E>详解 分类:Android2012-09-01 13:139412人阅读评论(5)收藏举报 android编程delete存储list 最近 ...
- 简诉android源代码编译过程,详解Android源码的编译
在这里我们将介绍的是Android源码的编译,主要基于Android 1.0环境下.希望对大家有所帮助. 本文将为大家介绍的是如何设置Android源码的编译环境,包括Linux下的配置.主要基于An ...
- android布局优化 工具,详解Android布局优化
怎样才能写出优秀的Android App,是每一个程序员追求的目标.那么怎么才能写出一个优秀的App呢?相信很多初学者也会有这种迷茫.一句话来回答这个问题:细节很重要.今天我们就从最基础的XML布局来 ...
最新文章
- php待办事项设计,如何为待办事项列表应用程序设计ViewModel?
- UVA 11478 Halum (差分约束)
- 颜色代码对照表、网页颜色选择器
- xstream解析xml字符串和生成对象
- SAP Cloud for Customer的Container应用设计原理
- RuoYi-Vue 部署 Linux环境 若依前后端分离项目(jar包+nginx 单机版本)
- Python类的魔法方法
- CSUOJ 1215: 稳定排序
- linux 下vim文件乱码 cat文件正常处理方法
- 【hive】Hive的安装过程与配置的详解
- Mongo分片+副本集集群搭建
- 20210310 20210311 :栈、队列、堆类题目合集
- lua io.read()
- 缓存穿透、缓存雪崩、缓存击穿的原因及解决方案
- Centos7.4 下cobbler安装及配置
- Atitit.python web环境的配置 attilax 总结
- axis调用webservice服务
- structure 2.3.4 软件使用指南
- 千学计算机在线计算,压力单位在线换算
- Matlab sum( ) 函数
热门文章
- Python3入门机器学习经典算法与应用 第3章 Jupyter Notebook numpy.array 基础 numpy.array的基本操作
- 20200105每日一句
- 实验假设与分析方法(参数与非参检验)
- Atitit 获取多媒体mp3 mp4 m4a元数据 G:\桌面安装\paidashi\bin\ffprobe.exe ffprobe -i 1.flv -print_format json -sh
- 程序实现对数据排序并按出现次数进行排序 程序实现对数据排序并按出现次数进行排序(注:用面向对象的方式实现,用for循环进行排序,别用comparable接口实现){1,4,2,1,3,2,1,4}作为
- Atitit.印章文化 印章的起源历史与发展 v2 r99 .docx
- Atiitt 降低财政赤字风险性实施方案
- Atititjs h5调用摄像头视频聊天 拍照功能 相机功能 录像attilax总结
- paip.java 注解的详细使用代码
- paip.slap工具与于64位win7与JDBC的性能对比