虽然前面提到了Android开发之数据请求方式有多线程+Handle方式、还有AsyncTask方式大致的2种请求原理,AsyncTask在APP中的同一个界面异步请求API使用得不是很频繁得情况下,还是蛮有用的。记得以前在一个APP应用界面中,由于写服务器API的同事没有很好的处理API的数据,导致在一个APP的界面上使用到的数据通过几次(大于4次)的AsyncTask来请求API数据,出现的现象就是其中的数据速度不快,或者其中的某一次、某几次没有结果响应。在此,我重复一次:一个APP界面数据的流畅与服务器API的配合非常重要(如:数据的分页加载、数据的格式处理、数据的排序加载、数据的分类加载 ......)。


     下面介绍 Android中异步请求之AsyncTask使用:



AsyncTask 是 Android 提供的一种异步任务处理类,它与线程类 Thread 相比,有以下优势:


1.preExcute() & postExcute()方法不仅可以进行预处理 & 收尾工作,而且它们归属于 UI 线程,所以你可以进行开启、关闭 loading 对话框等操作。


2.doInBackground()方法 & 构造器都支持泛型参数,且内部可以进行参数传递,封装性较好,注意doInBackground()属于后台线程,不能执行 UI 操作。


3.AsyncTask 比 Thread 更容易控制,它提供了cancel()方法,关于AsyncTask生命周期,


一、定义



  1. private class MyAsyncTask extern AsyncTask{  
  2. ...  
  3. }  



二、实例化 & 执行



  1. MyAsyncTask task = new MyAsyncTask();  
  2. task.excute();  



三、AsyncTask 的生命周期


AsyncTask 会依次执行 onPreExcute()—doInBackground()—[可能执行onCancel()]—onPostExcute().


四、注意事项:


1.AsyncTask 的最大上限数量


我没有在SDK的文档中找到具体说明,但开发中已经领教过了,同种类型的 AsyncTask 实例,最大数量为 20 个。


如果超过,则会引发 RejectExcuteException,并 crash


因此,要考虑到用户的操作是否会引发频繁的 AsyncTask 实例化,若存在,则从 UI 上进行改进,比如:


分页机制;


线程池;


生产者-消费者模型。


2.取消AsyncTask任务


文档已经说明,cancel()方法不一定能成功,所以 onCancel() 回调方法不一定被调用。


但若一个 AsyncTask 结束,则一定会调用 onPostExcute() 方法。


对于一个 doInBackground()方法中含有 while/for 循环时,最好配置 isCancel标置来 break 循环。