Android中AsyncTask的简介
在Android应用开发中,总会遇到耗时的任务,这些任务如果是在主线程中,那么就会造成主线程假死。为了解决这个问题,我们经常使用的方法是开一个子线程来专门处理这个耗时的任务。或者是使用AsyncTask在后台异步的处理这个任务。
-----------------------------------------------------------------------------------------
在Android开发中,我们要遵循单线程模式:Android UI操作并不是安全的并且这些操作必须在UI线程中执行,在单线程模式中我们记住这两条:不要阻塞UI线程,确保只在Ui线程中访问UI控件。
---------------------------------------------------------------------------------------
在子线程中提供了5中方法来实现与UI线程的交互:
第一种方法:Activity.runUiThread(Runnable);
第二种方法:View.post(Runnable);
第三种方法:View.postDelayed(Runnable);
第四种方法:Handler、Message、Looper
第五种方法:AsyncTask
--------------------------------------------------------------------------------------------------
AsyncTask是个抽象类,是一个工具类,在后台异步的处理任务,不会阻塞UI线程。本质上它底层是个线程池(而Handler底层是个消息队列)
它的缺点是:当有多个异步任务的时候并且需要与UI线程交互,就会变的很复杂。优点就是快,简单
对与Handler处理的异步任务,它的缺点就是在只有单个的异步任务的时候,代码就显得多。优点就是多个异步任务的时候,过程清晰。
使用AsyncTask的时候注意两个问题:一是,AsyncTask类要在主线程中构造;二是,AsyncTask的excute()方法也要在主线程中调用。
AsyncTask定义了三种泛型类型Params、Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果。
使用AsyncTask的步骤:使用AsyncTask总共有四个步骤,每一步都对应一个回调方法,但是这些方法都不是应用程序调用,我们要做的就是实现这些方法,当任务执行的时候,这些方法会自动的调用执行。
onPreExcute()在任务执行之前开始调用,比如可以在这里显示进度对话框等。
doInBackground(Params...)在后台执行,完成任务的主要工作,这个时候通常需要很长时间,在执行过程中可以调用publicProgress(Progress)来更新任务的进度。
onPostExcute(Result) 该方法实在主线程中执行,任务执行完的结果可以作为此方法的参数返回。