在Android开发中往往要使用多线程操作,通常会进耗时操作放在单独的线程中执行,避免其占用主线程,但是子线程无法操作主线程,在子线程操作主线程会出错误。Android提供了Handle类来实现子线程更新UI线程,但是代码会显得臃肿,使用AsynTask一个轻量级的异步任务,任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦,会使代码清爽很多。
如果每个任务都要创建一个线程,那么应用程序的效率要低很多,并且线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负,为了解决以上的问题,Android在1.5版本引入了AsyncTask。AsyncTask是使用java.util.concurrent框架来管理线程以及并发任务的执行,concurrent框架是一个非常成熟,高效的框架,经过了严格的测试,因此AsyncTask很好的解决了多线程的问题。
1、AsyncTask的执行步骤
AsyncTask的执行分为四个步骤,每一步都对应执行方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用执行。
(1) onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。
(2) onProgressUpdate(Progress… values) 当任务执行中调用,此方法在主线程执行,用于显示任务执行的进度。
(3) doInBackground(Params… params) 此方法在后台线程执行(子线程),完成任务的主要工作,通常是一个耗时操作。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
(4) onPostExecute(Result…result) 此方法在主线程执行(UI线程),任务执行的结果作为此方法的参数返回。
2、AsyncTask的泛型类型 Params,Progress和Result。
AsyncTask定义了三种泛型类型 Params,Progress和Result。
(1) Params 启动任务执行的输入可变参数,比如HTTP请求的URL,可以指定多个。
(2) Progress 后台任务执行的百分比。在doInBackground()中调用调用publicProgress(Progress…)设置的参数。
(3) Result 后台执行任务最终返回的结果,比如String、object…
3、AsyncTask使用实例
正确使用AsyncTask类,要遵守以下几条准则:
(1) Task的实例必须在UI thread中创建。
(2) execute方法必须在UI thread中调用。
(3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)这几个方法。
(4) 该task只能被执行一次,否则多次调用时将会出现异常。
(5) doInBackground方法和onPostExecute的参数必须对应。
下面是从网上获取一个网页在TextViewh中展示源码的实例
1 | import android.os.AsyncTask; |