AsyncTask可以使得使用UI线程变的更容易更适当,它可以在后台运行一些操作然后在UI上展现,不用操作具体的线程和handlers
一个 asynchronoustask包括三种基本类型(调用参数,进度和结果),和四个步骤(调用开始,在后台运行,处理进度,结束)
), and most often will override a second one(onPostExecute(Result).)
使用方法描述
Asynchronous Task必须是作为一个子类来使用,
task实例必须在UI线程创建
execute(Params...)必须在UI线程调用
不要手工调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)。
task只可以execute一次,执行多次就报异常
一个例子
类的定义
类的使用
new DownloadFilesTask().execute(url1, url2, url3);
三种基本类型的说明
Params, 传给task的参数的类型
Progress, 表示进度单位的类型
Result, 返回类型
不是所有的task都需要定义类型,如果没有则使用void,如下所示
private class MyTask extends AsyncTask { ... }
四个步骤的说明
onPreExecute():
在task被执行之后,立刻调用
doInBackground(Params...):
onPreExecute执行完毕后,执行该方法,参数传到了这个方法中,执行完毕后必须返回一个值,还可以使用publishProgress(Progress...)发布进度到onProgressUpdate(Progress...),便于更新进度
onProgressUpdate(Progress...):
publishProgress(Progress...)被调用后,就执行该方法,显示进度信息
通常是显示一个进度条,或在text域里显示日志信息
onPostExecute(Result)
当doInBackground(Params...)执行完毕后即执行该方法
手机实名制OCR功能中的实例
例子一
定义
class OcrTask extends AsyncTask
{
}
调用
OcrTask ocr = new OcrTask();
ocr.execute(save_file_path);
例子二
保存图片任务,参数是byte数组,是图片对应的byte数组
class SavePhotoTask extends AsyncTask
{
}
调用
SavePhotoTask savePhotoTask = new SavePhotoTask();
savePhotoTask.execute(data);