AsyncTask 允许你在后台线程上运行任务的同时,将获取结果发布到UI线程。
UI线程有一个消息队列和允许你发送和处理来自其他线程的可运行对象和消息的处理程序,AsyncTask 用一个相当简单的接口来封装这个行为。AsyncTask 是一个泛型类,这意味着它在其构造函数中使用参数化类型,这些泛型参数的每一个都是带有三个点的Java变量参数,这意味着严格来说他作为一个数组在Java世界中传递
AsyncTask 使用的三种类型如下:
Params 即执行时发送给任务的参数类型
Progress 即发布的使用后台计算来更新进度的类型
Result 即后台计算结果类型
这三个参数对应你可以在AsyncTask中覆盖的三个主要函数:
doInBackground();
onProgressUpdate();
onPostExecute();
还有一个用来帮助完成模式的onPreExecute()函数。
为了执行AsyncTask 你调用Execute并将参数设置为后台任务,然后AsyncTask会运行几个步骤:
首先,它在UI线程上调用onPreExecute(),这样你可以在后台任务开始前初始化你的想在UI线程中启动的任何东西,然后他在另一个线程上调用doInBackground(),你的长时间运行任务将在此运行,这是唯一必须被覆盖才能使用该类的方法。并且它使用你传递给Execute函数的参数调用,如果你想要长时间任务的进度来更新一些UI,则使用进度参数调用publishProgress(),这会让你的进度参数在UI线程上调用onProgressUpdate(),你可以从doInBackground()多次调用publishProgress(),最终,当doInBackground()线程上运行的任务完成时,你返回结果。这会使用返回的结果在UI线程上调用onPostExecute()。
AsyncTask 是在Android上的线程之间进行线程和消息传递的有用抽象类,它不一定在所有情况下都适用。但可以作为多线程环境编写代码的很好开端。