官方文档上有一段话很有用
from: http://developer.android.com/reference/android/os/AsyncTask.html
Cancelling a task
A task can be cancelled at any time by invoking cancel(boolean). Invoking this method will cause subsequent calls to isCancelled() to return true. After invoking this method, onCancelled(Object), instead of onPostExecute(Object) will be invoked after doInBackground(Object[]) returns. To ensure that a task is cancelled as quickly as possible, you should always check the return value of isCancelled() periodically from doInBackground(Object[]), if possible (inside a loop for instance.)
一个任务能够在任何时间被取消掉,通过调用 cancel(boolean)。调用此方法会调用isCancelled() 来返回true,调用此方法后,doInBackground(Object[]) 返回后不是调用 onPostExecute(Object) 而是调用onCancelled(Object)。为了让任务能够尽快的停止,(如果可能的话)我们应该在doInBackground(Object[])里一直检查isCancelled()的返回值是不是true。
一个异步任务只能被执行一次,第二次会报错,为了防止连续点击,有个小技巧
private static long lastClickTime = 0;
/**
* 防止按钮连续点击,按钮在500毫秒内不能同时起效
* @return
* 调用方法
public void onClick(View v) {
if (UIUtil.isFastDoubleClick()) {
return;
}
}
*/
public static boolean isFastDoubleClick(){
long time = System.currentTimeMillis();
long timeD = time - lastClickTime;
if(0 < timeD && timeD < 500){
return true;
}
lastClickTime = time;
return false;
}
另外另外有篇文章不错,参考着看 from : http://blog.sina.com.cn/s/blog_6dae87540100wacg.html
一、结构
public abstract class
java.lang.Object
android.os.AsyncTask<Params, Progress, Result>
二、类概述
AsyncTask能够适当地、简单地用于
异步任务的定义是一个在后台线程上运行,其结果是在
三、用法
doInBackground(Params...)
)
,最经常
覆盖
另一个
(
onPostExecute(Result)
.)
下面是一个子类的例子:
四、AsyncTask的泛型类型
这三个类型被用于一个异步任务,如下:
1.
2.
3.
在一个异步任务里,不是所有的类型总被用。假如一个类型不被使用,可以简单地使用 Void
类型:
五、4个步骤
当一个异步任务被执行,任务经过四各步骤:
1.onPreExecute()
,在UI线程上调用任务后立即执行。这步通常被用于设置任务,例如在用户界面显示一个进度条。
2.doInBackground(Params...)
,后台线程执行onPreExecute()完后立即调用,这步被用于执行较长时间的后台计算。异步任务的参数也被传到这步。计算的结果必须在这步返回,将传回到上一步。在执行过程中可以调用publishProgress(Progress...)
来更新任务的进度。
3.onProgressUpdate(Progress...)
,一次呼叫 publishProgress(Progress...)
后调用 UI线程。执行时间是不确定的。这个方法用于当后台计算还在进行时在用户界面显示进度。例如:这个方法可以被用于一个进度条动画或在文本域显示记录。
4.onPostExecute(Result)
,
六、线程规则
有一些线程规则必须去遵守,这个类才会正确的工作:
任务实例必须创建在 UI线程
execute(Params...)
必须在UI线程上调用
不要手动调用
onPreExecute()
, onPostExecute(Result)
, doInBackground(Params...)
, onProgressUpdate(Progress...)
这个任务只执行一次(如果执行第二次将会抛出异常)
七、内部类
表示任务的当前状态
八、构造函数
创建一个新的异步任务。这个构造函数必须在UI线程上调用。
九、公共方法
public final boolean
尝试取消这个任务的执行,如果这个任务已经结束或者已经取消或者不能被取消或者某些其他原因,那么将导致这个操作失败,当调用此方法时,此方法执行成功并且这个任务还没有执行,那么此任务将不再执行。如果任务已经开始,这时执行此操作传入的参数mayInterruptIfRunning为true,执行此任务的线程将尝试中断该任务。
参数
mayInterruptIfRunning
返回值
参见
public final AsyncTask<Params, Progress, Result>
用指定的参数来执行此任务,这个方法将会返回此任务本身,所以调用者可以拥有此任务的引用。此方法必须在UI线程中调用
参数
params
返回值
AsyncTask的实例
异常
IllegalStateException
public final Result
等待计算结束并返回结果
返回值
计算结果
异常
CancellationException
ExecutionException
InterruptedException
public final Result
等待计算结束并返回结果,最长等待时间为:timeOut(超时时间).
参数
timeout
unit
返回值
计算结果
异常
CancellationException
ExecutionException
InterruptedException
TimeoutException
public final AsyncTask.Status
获得任务的当前状态
返回值
public final boolean
如果在任务正常结束之前取消任务成功则返回true,否则返回false
返回值
十、受保护方法
覆盖此方法在后台线程执行计算,此方法中的参数是此任务的execute(Params...)
方法的调用这传递的参数,此方法可以调用publishProgress(Progress...)在
UI线程中来更新数据
参数
params
返回值
返回一个由此任务子类定义的结果
protected void
此方法在UI线程中当cancel(boolean)
参见
protected void
此方法在UI线程中doInBackground(Params...)
。方法调用之后调用,此方法中的参数的值是doInBackground(Params...)
的返回值或者当此任务已经被取消或有异常发生时此参数值为空
null
参数
result doInBackground(Params...)
计算出的操作的结果。
参见
protected void
在方法doInBackground(Params...)
调用之前调用
参见
protected void
该方法在UI线程中publishProgress(Progress...)
被调用之后调用,该方法中的参数
values是已经被传递到
publishProgress(Progress...)
中的参数
values
参见
protected final void
当调用doInBackground(Params...)
在后台执行计算时会调用该方法,每当在UI线程中调用此方法时将触发onProgressUpdate(Progress...)
方法的执行
参数
values
参见