android定义 task,Android:AsyncTask详解(1)

Android:AsyncTask详解(1)

1、Guides(概述)

AsyncTask,异步线程任务,在主线程中创建、使用,允许进行后台操作并将处理结果返回给主线程。而Thread和Handler则要创建多个来实现后台操作的功能。

AsyncTask是封装好的线程池,与Thread+Handler处理方式相比,AsyncTask在操作UI线程上更方便。AsyncTask适合使用短时间的处理异步任务,如果需要长时间的线程处理任务,建议使用Executor,ThreadPoolExcutor和FutureTask。

AsyncTask定义了三种类型参数:Pramas,Progress和Result,执行的四个步骤:onPreExcute,doInBackground,onProgressUpdate和onPostExcute

AsyncTask必须作为子类来使用,使用的时候必须override一个方法(doInBackground(Params…)),通常还会override一个方法(onPostExcute(Result))来获取执行结果。

2、Usage(使用)

private class DownloadFilesTask extends AsyncTask {

protected Long doInBackground(URL... urls) {

int count = urls.length;

long totalSize = 0;

for (int i = 0; i 

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

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

// Escape early if cancel() is called

if (isCancelled()) break;

}

return totalSize;

}

protected void onProgressUpdate(Integer... progress) {

setProgressPercent(progress[0]);

}

protected void onPostExecute(Long result) {

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

}

}

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

3、AsyncTask's generic types(三种参数)

Params,要执行的参数

Progress,在后台处理的进度参数

Result,后台处理的结果参数

4、The 4 steps(四个步骤)

当一个异步任务被执行的时候,任务处理的流程有4个步骤

onPreExcute(),在任务被执行前唤醒主线程,这一步一般用来初始化任务执行的进度条

doInBackground(Params),在执行onPreExcute()方法之后立即调用本方法,这一步是处理长时间的操作,接收传递来的参数,并将处理后的结果返回给最后一步。在这里调用publishProgress(Progress)来显示任务的处理进度。调用onProgressUpdate(Progress)进度在UI线程中显示出来。

onProgressUpdate(Progress),显示当前任务进度

onPostExecute(Result),获取任务处理结果

5、Cancelling a task(取消任务)

//任务调用cancel(boolean)方法来停止当前任务

A task can be cancelled at any time by invoking cancel(boolean).

//之后调用isCancel方法并返回ture,不再执行onPostExecute(Result),取代是调用onCancel(Object);

6、Threading rules(规则)

The AsyncTask class must be loaded on the UI thread.(必须在主线程中加载)

The task instance must be created on the UI thread.execute(Params...)must be invoked on the UI thread.(任务线程必须在主线程执行)

do not callonPreExecute(),onPostExecute(Result),doInBackground(Params...),onProgressUpdate(Progress...)manually.(不要主动调用这四个方法)

The task can be executed only once (an exception will be thrown if a second execution is attempted.)(可以只执行一次)

7.Order of execution(执行顺序)

在1.5中初始引入的时候, AsyncTask 执行( AsyncTask.execute() )起来是顺序的,当同时执行多个 AsyncTask的时候,他们会按照顺序一个一个执行。前面一个执行完才会执行后面一个。这样当同时执行多个比较耗时的任务的时候 可能不是您期望的结果,具体情况就像是execute的task不会被立即执行,要等待前面的task执行完毕后才可以执行。

在android 1.6(Donut) 到 2.3.2(Gingerbread)中,AsyncTask的执行顺序修改为并行执行了。如果同时执行多个任务,则这些任务会并行执行。 当任务访问同一个资源的时候 会出现并发问题.

而在Android 3.0(Honeycomb)以后的版本中,AsyncTask又修改为了顺序执行,并且新添加了一个函数 executeOnExecutor(Executor),如果您需要并行执行,则只需要调用该函数,并把参数设置为并行执行即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值