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) 该方法实在主线程中执行,任务执行完的结果可以作为此方法的参数返回。

posted on 2012-08-22 17:04  ssy黑桃a  阅读(1053)  评论(0编辑  收藏  举报