android asyncTask 笔记

Android中通常分为主线程(UI Thread/ Main Thread)和工作线程(worker Thread).

所有的组件默认都是在主线程里面的,当进行一些耗时的操作时,比如:访问网络或者对数据库进行处理的时候UI Thread 就会被阻塞,如果阻塞时间超过5秒,这是就会出现比较常见的ANR(Application Not Responding)现象,就是弹出一个框框来,等待还是确定退出。虽说,对于android开发来说,出现ANR现象是绝对不允许的,但是我手机上的QQ啊微信啊,还是经常会出现各种ANR,手机配置网络啊等因素,操作不当也会 呵呵。

由于Android UI控件是线程不安全的,所以不能再UI Thread 之外的线程当中对我们的UI控件进行操作 有两条必须要准守的原则:

1、绝对不能在UI Thread当中进行耗时的操作,不能阻塞我们的UI Thread

2、不能再UI Thread之外的线程当中操作我们的UI元素

对此Android提出了两种解决方式

1、Handler机制

2、AsyncTask机制

一、AsyncTask的使用

3个泛型

MyAsyncTask extends AsyncTask<Params,Progress,Result>

Params:传递给异步任务的参数类型

Progress:异步任务在执行的时候的进度 返回给UI线程的参数的类型

Result:异步任务执行完后返回给UI线程的结果的类型

比如下面的例子中下载一张网络图片:

MyAsyncTask extends AsyncTask<String, Integer, byte[]>

String:URL路径

Integer:进度条的单位

byte[]:下载好的图片 以字节数组返回

4个步骤

继承AsyncTask 必须得实现方法 doInBackground(Patams... params)

不过在项目中专业一点,就按四部走吧

onPreExcute();//异步执行前的时候执行,这方法是在UI thread里面执行的 通常可以弹出 显示刷新进度条

doInBackground(Patams... params);//处理异步任务的方法 系统会开辟一个worker Thread执行这个方法 执行完后 将结果发送给 onPostExcute(Result... result);在执行的过程中可以调用publicProgress(Progress...)来跟新任务的进度

onProgressUpdate(progress... values);//在执行异步任务的时候,需要跟新进度到UI界面 也是在UI Thread里面执行的。最长见的就是 进度条的跟新

onPostExcute(Result... result);//异步任务执行完后执行,也是在UI Thread 里面执行的。

其他

1、我们可以在任何时刻来取消我们的异步任务的执行,通过调用 cancel(boolean)方法,调用完这个方法后系统会随后调用 isCancelled() 方法并且返回true。如果调用了这个方法,那么在 doInBackgroud() 方法执行完之后,就不会调用 onPostExecute() 方法了,取而代之的是调用 onCancelled() 方法。为了确保Task已经被取消了,我们需要经常调用 isCancelled() 方法来判断,如果有必要的话。

2、在使用AsyncTask做异步任务的时候必须要遵循的原则:

  • AsyncTask类必须在UI Thread当中加载,在Android Jelly_Bean版本后这些都是自动完成的
  • AsyncTask的对象必须在UI Thread当中实例化
  • excute方法必须在UI Thread当中调用
  • 不要手动的去调用AsyncTask的onPreExecute, doInBackground, publishProgress, onProgressUpdate, onPostExecute方法,这些都是由Android系统自动调用的
  • AsyncTask任务只能被执行一次

具体的有同学想结合简单的例子来看的,请看这篇文章:

http://www.cnblogs.com/xiaoluo501395377/p/3430542.html

2、AsyncTask的优缺点

优点:

1、简单、快捷

2、过程可控

缺点:

在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.

随便说下Handler的优缺点(new一个Thread在run方法里面handler.sendEmptyMessage(0);在Handler的实现类里面跟新UI)

在Handler 异步实现时,涉及到Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。

使用的优点(Thread+Runnable+handler):

1.结构清晰,功能定义明确

2. 对于多个后台任务时,简单,清晰

使用的缺点:1.在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)

AsyncTask真正的缺点在于,AsyncTask的全局线程池只有5个,最多5个同时运行,其他的被阻塞(自己new出来的Thread不受影响)

所以AsyncTask不要用于多线程获取网络数据,因为很有可能会产生阻塞,效率降低。

回答一个面试题:

能否同时并发100+asynctask呢?

AsyncTask用的是线程池机制,容量是128,最多同时运行5个core线程,剩下的排队。

时间: 2024-10-09 22:14:38

android asyncTask 笔记的相关文章

【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask

目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csdn.net/flowingflying/ 之前,我们直接在activity中执行http通信,在通信过程中可能会出现连接超时.socket超时等情况,超时阈值一般是秒级,例如AndroidHttpClient中设置的20秒,如果出现超时,就

Android学习笔记(四二):SQLite、ListView、ContextMenu

继续上一个例子,结合ListView中对SQLite进行操作. 通过CursorAdapter在ListView中的数据呈现 在上一个例子中,我们可以对SQLite中的数据库进行增删改查,将数据读到游标Cursor中,然后一一读出.在Android中可以通过CursorAdapter直接将数据映射到ListView中,如下处理: public class Chapter22Test1 extends ListActivity{    private SQLiteDatabase  db = nu

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

【转】 Pro Android学习笔记(七六):服务(1):local和remote

文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的组件,没有UI,独立于activity的生命周期.有两种类型的服务:local services和remote services.本地服务是只能被本应用调用,而远端服务则可以被其他应用调用.远端服务通过AIDL(Android Interface Definition Language)描述.在服务

Android开发笔记(一百零六)支付缴费SDK

第三方支付 第三方支付指的是第三方平台与各银行签约,在买方与卖方之间实现中介担保,从而增强了支付交易的安全性.国内常用的支付平台主要是支付宝和微信支付,其中支付宝的市场份额为71.5%,微信支付的市场份额为15.99%,也就是说这两家垄断了八分之七的支付市场(2015年数据).除此之外,还有几个app开发会用到的支付平台,包括:银联支付,主要用于公共事业缴费,如水电煤.有线电视.移动电信等等的充值:易宝支付,主要用于各种报名考试的缴费,特别是公务员与事业单位招考:快钱,被万达收购,主要用于航空旅

【转】Android开发笔记(序)写在前面的目录

原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入门上:其次是想拾缺补漏,写写虽然小众却又用得着的东西:另外就是想以实用为主,不求大而全,但求小而精:还有就是有的知识点是java的,只是Android开发也会经常遇上,所以蛮记下来.个人的经

Android学习笔记——关于onConfigurationChanged

从事Android开发,免不了会在应用里嵌入一些广告SDK,在嵌入了众多SDK后,发现几乎每个要求在AndroidManifest.xml申明Activity的广告SDK都会要求加上注明这么一句属性: android:configChanges="orientation|keyboard|keyboardHidden" 通过查阅Android API可以得知android:onConfigurationChanged实际对应的是Activity里的onConfigurationChan

Android开发笔记(一百零三)地图与定位SDK

集成地图SDK 国内常用的地图SDK就是百度和高德了,二者的用法大同小异,可按照官网上的开发指南一步步来.下面是我在集成地图SDK时遇到的问题说明: 1.点击基本地图功能选项,不能打开地图,弹出"key验证出错!请在AndroidManifest.xml文件中检查key设置的"的红色字提示.查看日志提示"galaxy lib host missing meta-data,make sure you know the right way to integrate galaxy&

android Asynctask的优缺点?能否同时并发100+asynctask呢?

一  Asynctask的优缺点? AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 优点: 1.简单,快捷 2.过程可控 3.使用的缺点: 缺点: 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理. 首先明确Android之所以有Handle