Android --AsyncTask异步任务(一)
1.为什么要异步任务
- Android单线程模式
- 耗时操作放在非主线程(UI线程)中执行
我们都知道Android是单线程模式,只有主线程才能对UI操作,简称UI线程。当然这样的好处是:保证UI的稳定性、准确性,避免多线程同时对UI的操作,导致UI的混乱
但同时Android是一个多线程的操作系统,不可能把全部的事情放在主线程。如果任务堵塞,当时间过长,会抛出ANR(Application Not Responding)错误。
2.AsyncTask为何而生
- 子线程中更新UI
- 封装、简化异步操作
3.构建AsyncTask子类的参数
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数:
- Params : 启动任务时输入参数的类型。
- Progress : 后台任务执行中返回进度值的类型
- Result : 后台执行任务完成后返回结果的类型
4.构建AsyncTask子类的回调方法
- doInBackground : 必须重写,异步执行后台程序将要完成的任务。
- onPreExecute : 执行后台耗时操作前被调用,通常用户完成一些初始化操作。
- onPostExecute : 当doInBackground() 完成后,系统自动调用onPostExecute()方法,并将doInBackground方法返回的值传给该方法
- onProgressUpdate : 在doInBackground() 方法调用publishProgress() 方法更新任务的执行进度后,就会触发该方法
现在我们来写一个测试类:
import android.os.AsyncTask;
import android.util.Log; public class AsyncTaskTest extends AsyncTask<Void, Void, Void>{ @Override
protected Void doInBackground(Void... params) { Log.i("Task", "doInbackgroun");
return null;
} @Override
protected void onPostExecute(Void result) { Log.i("Task", "onPostExecute");
super.onPostExecute(result);
} @Override
protected void onPreExecute() { Log.i("Task", "onPreExecute");
super.onPreExecute();
} @Override
protected void onProgressUpdate(Void... values) { Log.i("Task", "onProgressUpdate");
super.onProgressUpdate(values);
}
}
在MainActivity中引用:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AsyncTaskTest task = new AsyncTaskTest();
task.execute();
}
当我们运行在模拟器上时:


根据上面的第四条所写,我们在doInBackground中调用publshProgress方法,运行后发现多了一个onProgressUpdate
protected Void doInBackground(Void... params) {
Log.i("Task", "doInbackgroun");
publishProgress(params);
return null;
}

谢谢大家的关注。I love you not for who you are, but for who I am before you.
Android --AsyncTask异步任务(一)的更多相关文章
- android AsyncTask异步下载并更新进度条
AsyncTask异步下载并更新进度条 //如果不是很明白请看上篇文章的异步下载 AsyncTask<String, Integer, String> 第一个参数:String 传入 ...
- Android AsyncTask异步加载WebAPI
之前做的程序一直存在很多问题,因为需要加载的Activity需要从网络加载数据.并没有完全正确的使用异步的方法去加载! 之前用的虽然是AsyncTask,但是在加载完成的时候还是并没有使用AsyncT ...
- Android AsyncTask异步任务(二)
之前我们讲过了AsyncTask 的生命周期(onPreExecute-->doInBackground-->onProgressUpdate-->onPostExecute),今天 ...
- Android AsyncTask 异步任务操作
1:activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/androi ...
- android AsyncTask异步任务(笔记)
AsyncTask是一个专门用来处理后台进程与UI线程的工具.通过AsyncTask,我们可以非常方便的进行后台线程和UI线程之间的交流. 那么AsyncTask是如何工作的哪. AsyncTask拥 ...
- Android线程管理之AsyncTask异步任务
前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...
- Android多线程分析之五:使用AsyncTask异步下载图像
Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇<An ...
- Android 多线程----AsyncTask异步任务详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Android 消息异步处理之AsyncTask
Android提供了异步处理消息的方式大致有两种,第一种是handler+Thread,之前已经对于这种方式做过分析,第二种就是AsyncTask,这是Android1.5提供的一种轻量级的工具类,其 ...
随机推荐
- Solr Cloud - SolrCloud
关于 Solr Cloud Zookeeper 入门,介绍 原理 原封不动转自 http://wiki.apache.org/solr/SolrCloud/ ,文章的内存有些过时,但是了解原理. Th ...
- java覆盖重写规则
重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别.(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限.) 比如:Object类有个toString()方法,开 ...
- MySQL wamp密码修改
WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空,所以直接按回车 ...
- a.redhat系统如何卸载默认jdk
Redhat系统安装之后,会默认有openjdk在安装(下图已经是卸载掉了) 这个openjdk下面的需要进行卸载,你可以通过命令进行卸载,例如首先查看JDK,然后默认直接通过rpm命令进行卸载L 卸 ...
- 使用input range滑块,控制元素transform rotate旋转样式
<!DOCTYPE html> <html> <head> </head> <body> <!-- 第一步:设置div旋转对象和inp ...
- lamp搭建,thinkphp安装
有几天没有记录学习进度了,简单回顾一下:前天由于不熟悉linux的安装操作,以及遇上了各种问题花了将近6小时搭建好了lamp,然而在中途学习修改配置时误改了启动的图形文件,导致了昨天开机时图形界面无法 ...
- Codility Tree Height
public class HeightOfTreeSolution { static int height=-1; public int solution(Tree T) { // write you ...
- 记一次使用jQuery清空元素
缘由: 数据量比较大,分页显示,页码是自己写的,动态创建页码,创建元素时会绑定元素的click事件,每次显示五个页码(1,2,3,4,5),点击2—4不换,点5,页码变成3,4,5,6,7. 遇到的问 ...
- ios基础操作
//// main.m //文件名// Day2-上课//工程名//// Created by 张开 on 16/1/5.//创建日期及创建人 ////单行注释:可以注释一段代码,起到了解释说 ...
- postgresql Delete+ join
using tablename as alias DELETE FROM tv_episodes USING tv_episodes AS ed LEFT OUTER JOIN data AS nd ...