安卓的异步任务AsyncTask

今天作者学习了安卓的异步任务,异步任务听起来是个好高大上的东西,其实并没有好高大上。

异步任务到底是什么东西呢?广泛地讲异步任务就是以多线程的方式完成的功能需求,相对于同步

而言,异步任务就是可以先完成第一步,开启一个线程完成第二步,而不需要等待第二步的完成就可

以去做第三步的事情。而同步任务就是要按顺序的完成任务,先完成第一步,在完成第二步,才能开始

第三步的事情。在安卓中异步任务值得就是AsyncTask这个类。这个类其实就是对Thread+Handler的封装

我们使用这个类就可以很简单地完成异步任务,像填空一样而不需要自己来设计流程。而且AsyncTask封装

了线程池,这样比直接使用Thread更有效率。

说了这么多,那下面我们就来讲讲AsyncTask的使用吧。

AsyncTask的使用很简单,首先创建AsyncTask对象,然后调用它的execute(Params)方法就可以了。下面贴上代码再一步一步分析。

new AsyncTask<String, Integer, String>(){
            protected void onPreExecute() {
                System.out.println("onPreExecute");
            };

            @Override
            protected String doInBackground(String... params) {
                System.out.println("doInBackground......."+params[0]);
                publishProgress(1);
                return "这是返回的结果集";
            };

            protected void onPostExecute(String result) {
                System.out.println("onPostExecute....."+result);
            };

            protected void onProgressUpdate(Integer[] values) {
                System.out.println("onProgressUpdate......"+values[0]);
            };

        }.execute("这是参数");

从上面代码中我们可以看到创建AsyncTask对象需要传入三个泛型。

AsyncTask<Params, Progress, Result>

Params 启动任务执行的输入参数,比如HTTP请求的URL。

第一个泛型用来限制execute(Params)和doInBackground(Params)方法传入参数的类型,在execute方法中传入的参数会在doInBackground回调方法中被使用。

Progress 后台任务执行的百分比。

第二个泛型用来限制onProgressUpdate(Progress)和publishProgress(Progress)方法传入参数的类型,在publishProgress方法中传入的参数会在onProgressUpdate回调方法中被使用。

Result 后台执行任务最终返回的结果,比如String。

第三个泛型是用来限制Result doInBackground的返回值和onPostExecute(Result)方法传入参数的类型,在doInBackground中返回的结果会在onPostExecute回调方法中被使用

下面就是执行结果:

08-06 12:28:33.680: I/System.out(1367): onPreExecute
08-06 12:28:33.710: I/System.out(1367): doInBackground.......这是参数
08-06 12:28:33.720: I/System.out(1367): onProgressUpdate......1
08-06 12:28:33.720: I/System.out(1367): onPostExecute.....这是返回的结果集

下面贴上AsyncTask类各个方法的作用和用法:

execute(Params... params) 启动任务, 开始任务的执行流程

void onPreExecute() 在分线程工作开始之前在UIThread中执行,一般用来显示提示视图

Result doInBackground(Params... params) 在workerThread中执行, 完成任务的主要工作,通常需要较长的时间

void onPostExecute(Result result)    在doInBackground()执行完后在UIThread中执行,一般用来更新界面

publishProgress(Progress... values) : 在分线程中, 发布当前进度

void onProgressUpdate(Progress... values) : 在主线程中更新进度

开启异步任务,当然也能取消异步任务,取消异步任务的方法如下:

调用cancle(boolean)方法取消还在执行的异步任务,调用该方法后将会回调isCancelled()方法返回true。

在调用该方法后,onCancelled(Object)代替了onPostExecute(Object)在执行完doInBackground(Object[])后回调。为了保证当前任务尽快被取消,你应该经常检查isCancelled()返回值情况....

异步任务大致的流程如下:

时间: 2024-10-03 21:49:47

安卓的异步任务AsyncTask的相关文章

异步任务AsyncTask使用解析

在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制.关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下. 为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任

安卓学习-界面-事件-AsyncTask

异步任务Asynctask完成一个下载 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height=&quo

android异步类AsyncTask的简单使用

Android为了降低这个开发难度,提供了AsyncTask.AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务,更通俗地说就是一个执行后台任务的线程 而且他还会自动通知主线程更新UI 优点: 结构清晰,容易理解. 缺点 代码量稍大 下面直接看代码 1 private class AsyncLogin extends AsyncTask<Void,Integer,Boolean>{ 2 private EditText passwordEdit; 3 private EditT

Android异步之Asynctask与Handler面试七问

提出问题: 1.Android中的异步处理方式? 2.如何使用Handler以及在使用过程中如何避免Handler引起的内存泄露? 3.从源码角度分析MessageQueue,Message,handler,looper,主线程,子thread之间的关系 4.Handler通过sendMessage以及post Runable对象有什么区别 5.如何给一个线程建立消息循环,即如何构建一个looper线程? 6.Asynctask中有哪些方法,分别如何使用,哪些方法在主线程执行,哪些方法在子线程执

Android 之异步任务(AsyncTask,Handler,Message,looper)

AsyncTask: 3个类型(Params,Progress和Result),4个步骤(onPreExecute(),doInBackground(Params…),onProgressUpdate(Progress…), onPostExecute(Result) ) Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理. 首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异

异步任务 AsyncTask

注:转载注明出处 异步任务:用于解决线程之间的数据传递(UI线程不能完成耗时操作,由子线程完成) AsyncTask异步任务执行流程: 1 继承AsyncTask类 参数:parmas   progress  result class MyAsyncTask extends AsyncTask<String, Integer, Integer>{ 重写3个方法 A: protected void onPreExecute(){ 耗时操作之前的准备工作(主线程) super.onPreExecu

安卓开发30:AsyncTask的用法

http://blog.csdn.net/initphp/article/details/10392093 安卓开发笔记系列(43)  在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.在单线程模型中始终要记住两条法则:  1. 不要阻塞UI线程  2. 确保只在UI线程中访问Android UI工具包        当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要

android 异步任务AsyncTask

package com.example.ansyctest; import java.io.ByteArrayOutputStream; import java.io.InputStream; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl

Android笔记二十六.Android异步任务处理(AsyncTask)

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.引言 我们知道Android的UI线程主要负责处理用户的按键事件.用户触屏事件及屏幕绘图事件等,对于其他的操作尽量不要在UI线程中实现,因为这些操作很有可能会阻塞UI线程,比如一些耗时操作,会导致UI界面停止响应,从而降低了用户的体验.所以,为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完成,但新线程也可能需要动态更新UI组件:比如需要从网上获取一个网页,然后在Te