认识AsyncTask
Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。
Android之所以有handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过后的后台任务类,顾名思义就是异步任务。AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。
AsyncTask定义了三种泛型类型 Params,Progress和Result。
- Params启动任务执行的输入参数,比如HTTP请求的URL。
- Progress后台任务执行的百分比
- Result后台执行任务最终返回的结果,比如String。
必须重写两个方法
- diInBackground(Params…)后台执行,比较耗时的操作都可以放在这里。
- onPostExecute(Result)相当于Handler处理UI的方式,在这里面可以使用在doInBackground得到的结果处理操作UI。此方法在主线程执行,任务执行的结果作为此方法的参数返回。
AsyncTask使用有一些限制,需要注意:
- AsyncTask类必须在UI线程中加载。在Android4.1之后由系统自动完成。
- AsyncTask实例必须在UI线程中创建。
- execute(Params…)方法必须在UI线程中调用。
- 不要手动调用提供的四个回调方法。
- 每个AsyncTask实例只能执行一次。
AsyncTask的优缺点
优点
- 方便实现异步通信
- 节省资源
缺陷 - 在3.0以前,最大支持128个线程的并发,10个任务的等待。在3.0以后,无论有多少任务,都会在其内部单线程执行。
解决
由一个控线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠否则请求AsyncTask继续处理。