您的位置:首页 > 移动开发 > Android开发

android.os.AsyncTask<String, Void, Integer>

2013-03-25 16:06 357 查看
简介

AsyncTask可以使得使用UI线程变的更容易更适当,它可以在后台运行一些操作然后在UI上展现,不用操作具体的线程和handlers

一个 asynchronous task包括三种基本类型(调用参数,进度和结果),和四个步骤(调用开始,在后台运行,处理进度,结束)

), 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一次,执行多次就报异常

一个例子

类的定义

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {

protected Long doInBackground(URL... urls) {

int count = urls.length;

long totalSize = 0;

for (int i = 0; i < count; i++) {

totalSize += Downloader.downloadFile(urls[i]);

publishProgress((int) ((i / (float) count) * 100));

}

return totalSize;

}

protected void onProgressUpdate(Integer... progress) {

setProgressPercent(progress[0]);

}

protected void onPostExecute(Long result) {

showDialog("Downloaded " + result + " bytes");

}

}

类的使用

new DownloadFilesTask().execute(url1, url2, url3);



三种基本类型的说明

Params, 传给task的参数的类型

Progress, 表示进度单位的类型

Result, 返回类型

不是所有的task都需要定义类型,如果没有则使用void,如下所示

private class MyTask extends AsyncTask<Void, Void, Void> { ... }



四个步骤的说明

onPreExecute():

在task被执行之后,立刻调用

doInBackground(Params...):

onPreExecute执行完毕后,执行该方法,参数传到了这个方法中,执行完毕后必须返回一个值,还可以使用 publishProgress(Progress...) 发布进度到onProgressUpdate(Progress...),便于更新进度

onProgressUpdate(Progress...):

publishProgress(Progress...)被调用后,就执行该方法,显示进度信息

通常是显示一个进度条,或在text域里显示日志信息

onPostExecute(Result)

当doInBackground(Params...)执行完毕后即执行该方法

手机实名制 OCR功能中的实例

例子一

定义

class OcrTask extends AsyncTask<String, Void, OcrMessage>

{

@Override

protected OcrMessage doInBackground(String... arg0)

{

ApplyService service = new ApplyService(getApplicationContext());

return service.ocrTest(save_file_path);

}

@Override

protected void onPostExecute(OcrMessage result)

{

returnImageScan(result);

}

}

调用

OcrTask ocr = new OcrTask();

ocr.execute(save_file_path);

例子二

保存图片任务,参数是byte数组,是图片对应的byte数组

class SavePhotoTask extends AsyncTask<byte[], Void, Integer>

{

String picname;

@Override

protected Integer doInBackground(byte[]... datas)

{

byte[] data = datas[0];

Bitmap bitmap;

BitmapFactory.Options ops2 = new BitmapFactory.Options();

ops2.inSampleSize = 1;

bitmap = BitmapFactory.decodeByteArray(data,0, data.length,ops2);



try {

FileOutputStream fos = OcrCameraActivity.this.openFileOutput("output.jpg",Activity.MODE_WORLD_READABLE);

bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos);

fos.flush();

fos.close();

save_file_path = "output.jpg";

}catch (Exception e) {

e.printStackTrace();

}

return 0;

}



@Override

protected void onPostExecute(Integer result)

{

call_OCR();

}

}

调用

SavePhotoTask savePhotoTask = new SavePhotoTask();

savePhotoTask.execute(data);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐