异步任务 AsyncTask

注:转载注明出处

异步任务:用于解决线程之间的数据传递(UI线程不能完成耗时操作,由子线程完成)

AsyncTask异步任务执行流程:

1 继承AsyncTask类

参数:parmas   progress  result

class MyAsyncTask extends AsyncTask<String, Integer, Integer>{

重写3个方法

A: protected void onPreExecute(){

耗时操作之前的准备工作(主线程)

super.onPreExecute();

}

2 重写doInBackground()方法-->网络访问,下载数据-->后台线程(耗时操作)(子线程)

B:protected Integer doInBackground(String...params){

发布进度:

C:   publishProgress(100); (主线程)

return null;

}

D: protected void onProgressUpdate(Integer...values){

更新进度,操作UI(主线程)

super.onProgressUpdate(values);

}

3 重写onPostExecute()方法-->下载数据之后的操作,更新UI

E: protected void onPostExecute(Integer result){

耗时操作结束后执行的方法

super.onPostExecute(result);

}

}

4 添加网络访问权限 清单文件中

<user-permission android:name="android.permission.INTENT"/>

1.单线程模型:
当一个APP启动后,由安卓系统,创建一个线程,用于展示UI以及和用户交互。成为主线程(也叫UI线程)

该线程要求:
A:不能够被阻塞,就是不能够耗时操作。
B:不能够超过5是。ANR(应用程序无响应)Application not Responsing

启动子线程,分担主线程的工作,比如完成耗时操作。也叫做工作线程WorkThread
A:不能够更新UI(android.view,android.widget)
android.view.ViewRootImpl$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.

2 使用异步任务来解决主线程和子线程之间的数据传递问题。
A:子线程耗时操作,获取数据
B:将数据传给主线程, 跟新UI。

AsyncTask类:
抽象类:

step1:onPreExecute()-->耗时操作之前执行的方法,用于准备操作。

step2:doInBackground()-->耗时操作所在的方法,用于访问网络。

step3:publishProgress(数据)-->发布进度

return 数据

step4:onProgressUpdate()-->用于更新进度。

step5:onPostExcute(doInBackground返回的结果)-->耗时操作执行后,执行的方法,用于操作数据更新UI

onCancelled()-->成功取消异步任务后,执行的方法。onPostExcute()就不执行了。

总结:

转自: http://www.cnblogs.com/android100/p/Android-AsyncTask.html

一、解决新线程无法更新UI组建问题的方案

为了解决新线程不能更新UI组建的问题,Andorid提供了如下几种解决方案:

  • 使用Handler实现线程之间的通信。
  • Activity.runOnUiThread(Runnable)。
  • View.post(Runnable)。
  • View.postDelayed(Runnable)。

二、ANR(Application Not Responding)异常

Android默认约定当UI线程阻塞超过20秒将会引发ANR(Application Not Responding)异常。但实际上,不要说20秒,即使是5秒甚至2秒,用户都会感到十分不爽。因此,没必要去记这个20秒的时间限度。总之,开发者必须牢记:不要在UI线程中执行一些耗时操作。

三、AsyncTask抽象类

AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数:

  • Params:启动任务执行的输入参数的类型。
  • Progress:后台任务完成进度值的类型。
  • Result:后台执行任务完成后返回结果的类型。

四、AsyncTask的特点

  • 更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可。

五、使用AsyncTask的步骤

1.创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,可将它指定为void。

2.根据需要,实现AsyncTask的如下方法:

doInBackground(Params …):后台线程将要完成的任务,可以调用publishProgress(Progress... values)方法更新任务执行进度。

onProgressUpdate(Progress... values):在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法。

onPreExecute():执行后台耗时操作前被调用,通常用户完成一些初始化操作,比如在界面上显示进度条。

onPostExecute(Result result):当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground方法返回的值传给该方法。

3.调用AsyncTask子类的实例的execute(Params... params)开始执行耗时任务。

六、使用AsyncTask时必须遵守的规则

  • 必须在UI线程中创建AsyncTask的实例。
  • 必须在UI线程中调用AsyncTask的execute()方法。
  • AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params... params)、onProgressUpdate(Progress... values)方法,不应该由程序员代码调用,而是由Android系统负责调用。
  • 每个AsyncTask只能被执行一次,多次调用将会引发异常。
时间: 2024-10-25 21:37:22

异步任务 AsyncTask的相关文章

异步任务AsyncTask使用解析

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

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的更新只能在主线程中完成,因此异

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

安卓的异步任务AsyncTask

今天作者学习了安卓的异步任务,异步任务听起来是个好高大上的东西,其实并没有好高大上. 异步任务到底是什么东西呢?广泛地讲异步任务就是以多线程的方式完成的功能需求,相对于同步 而言,异步任务就是可以先完成第一步,开启一个线程完成第二步,而不需要等待第二步的完成就可 以去做第三步的事情.而同步任务就是要按顺序的完成任务,先完成第一步,在完成第二步,才能开始 第三步的事情.在安卓中异步任务值得就是AsyncTask这个类.这个类其实就是对Thread+Handler的封装 我们使用这个类就可以很简单地

Android源代码解析之(三)--&amp;gt;异步任务AsyncTask

转载请标明出处:一片枫叶的专栏 上一篇文章中我们解说了android中的异步消息机制. 主要解说了Handler对象的使用方式.消息的发送流程等.android的异步消息机制是android中多任务处理的基础,Handler是整个android应用层体系异步消息传递的基础组件,通过对Handler源代码的解析的解析相信大家对android中的异步消息机制有了一个大概的了解.很多其它关于android中的异步消息机制的知识可參考我的:android源代码解析之(二)–>异步消息机制 android

android中的异步任务-----------AsyncTask的使用

遇到的问题 ------为什么要是红asyncTask 向服务器端发送一个http请求,服务器端返回给用户一些数据,然后将这些数据展示在ui当中 这时候就会出现一种现象:因为android访问服务器必须放在子线程当中,而ui的更新数据又必须放在主线程当中,所以当主线程展示数据的时候,遇到一些耗时操作 比如访问服务器,数据库查询等操作,主线程就会阻塞,用户就会看到ANR(程序未响应).而AsyncTask很好的解决了这一类问题 AsyncTask的使用方法 创建一个类MyTask继承自AsyncT