如何正确选择AsyncTask还是Handler?与Handler相比,AsyncTask消耗资源如何?是多线程吗?先抛出疑问。
一 AsyncTask是什么:
1)Android为了降低异步操作开发难度,结合Handler和线程池,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,异步任务。他具有可以再后台执行耗时操作,同时可以将执行进度与UI进行同步。
2)AsyncTask定义了三种泛型类型,Params,Progress、Result。
>Params启动任务执行的输入参数,比如http请求的url;
>Progress后台任务执行的百分比;
>Progress后台执行任务最终返回的结果,比如String。
3)AsyncTask常用方法
>doInBackground(Params...)后台执行,比较耗时的操作都可以放在这里进行。注意这里不能直接操作UI。此方法在后台进程中尅调用publicProgress(Progress...)来更新任务的进度。
>onPostExcute(Result)相当于Handler处理UI的方法,在这里可以使用doInBackground得到结果处理操作UI。此方法在主线程中执行,任务执行的结果作为方法的参数返回;
>onProgressUpdate(Progress...)可以使用进度条增加用户体验,此方法在主线程执行,用于显示任务执行进度;
>onPreExcute()这里是最终用户调用Excute时的接口,在任务执行之前开始调用此方法,可以再这里显示进度对话框;
>onCancelled()用户调用取消时,要做的操作。
4)AsyncTask三种状态
pending,running,finished
5)AsyncTask使用规则
>AsyncTask必须在主线程创建;
>execute()只能调用一次,也必须在主线程中执行;
>不要自己调用onPreExcute(),onPostExcute(),doInBackgound(),onProgressUpdate(),系统自己调用。
二AsyncTask与Handler对比
通过看源码,发现AsyncTask实际上就是一个线程池(包含了Handler ThreadPoolExecutor),所以AsyncTask比handler更耗资源,虽然AsyncTask在代码上比handler要轻量级别。而Handler仅仅就是发送了一个消息队列,连线程都没有开,他只是依附在创建的线程中。
但是,如果异步任务的数据特别庞大,AsyncTask这种线程池结构的优势就体现出来了。
所以,什么时候使用AsyncTask,什么时候使用Handler就非常明显了。
>任务可以被终止,并需要不断使用时,用AsyncTask;
>任务需要被多次重复执行,且与UI交互少时,用Handler。