AsyncTask
类的简介:
AsyncTask可以使UI线程更合理更简单的使用。这个类允许执行后台操作,而且可以在不使用多线程或handlers的情况下给主线程传输数据。
异步任务 被定义为在后台进行的运算,结果发布到主线程。
异步任务 被三种类型和四个步骤所定义,三种类型分别是Params,Progress,Result和四个步骤分别是begin,doInBackground,processProgress和end。
使用方法:
异步任务必须被继承使用,它的子类至少要覆写方法:doInBackground方法,通常也要覆写另一个方法:onPostExecute(Result)。
上面的代码是其子类异步下载文件的示例。
异步任务的三种类型
异步任务的三种类型的描述如下:
1.Params:发送给正在执行的任务的参数(参数类型)。
2.Progress:正在后台运算的时候发布的进度(进度类型)
3.Result:后台运算的结果(返回值的类型)
异步任务并不非得使用所有这些类型,为了标记不使用的类型,简单的在其位置上填入Void。
比如:上面的代码。
四个步骤:
当一个一步任务执行时,任务的四个步骤如下:
1.onPreExecute(),在异步执行时立即被UI线程调用,这一步通常用来设置任务,比如在用户界面显示进度条。
2.doInBackground(Params…),当onPreExecute()方法执行完成时立即被后台线程调用。这一步用来执行耗时间的后台操作。异步任务的参数被传到这一步里。操作的结果必须在这一步被返回并且会被传到最后一步。这一步也可以使用publishProgress(Progress…)来发布一个或者多个进度单位。这些值在onProgressUpdate(Progress…)这一步被发布到UI进程中
3.onProgressUpdate(Progress…),在调用publishProgress(Progress…)之后被UI线程调用,执行的时间不定。这个方法用来在后台操作仍在执行的时候在用户界面显示不同形式的进度。比如它可以推动进度条进度或者在文本里显示log信息。
4.onPostExecute(Result…),在后台程序结束后被UI线程调用。后台程序执行的结果以参数的形式传给这一步。
线程规则
为了是这一个类更好的被使用,要遵循下面几个原则:
1任务实例必须在主线程中创建
2Execute(Params…)必须被UI线程调用
3不用手动的调用onPreExecute(),onPostExecute(Result), dolnBackgrcund(Params. . .), onProgressUpdate(Progress.. .)
4任务只能被执行一次(当尝试执行第二个时会抛出异常)