AsyncTask是一个简单的异步任务处理类。
使用AsyncTask
AsyncTask是一个抽象类,要想使用必须创建一个AsyncTask的子类,并覆盖一些必要的方法。
/**
* Params 代表执行时发给任务的参数类型
* Progress 后台任务执行中发布的任务进度的类型
* Result 任务完成后返回的结果类型
*/
class MyTask : AsyncTask<Params, Progress, Result>() {
override fun onPreExecute() {
//在执行任务之前在UI线程调用
}
override fun doInBackground(vararg params: Params?): Result {
//在onPreExecute()方法执行后立即在后台线程执行
//可使用publishProgress()方法发布任务进度
//必须覆盖
}
override fun onProgressUpdate(vararg values: Progress?) {
//在UI线程调用,publishProgress()方法后调用
}
override fun onPostExecute(result: String?) {
//在UI线程调用,doInBackground()方法返回后调用
}
}
要想开始任务,请调用execute(Params... params)方法。值得注意的是,AsyncTask必须在UI线程上初始化且execute()方法也必须在UI线程调用。该任务只能被执行一次,如果要执行第二次,将会引发异常。要想取消任务,可以调用cancel(booelan mayInterruptIfRunning)方法。true表示应将执行该任务的线程中断,false表示允许正在执行的任务完成。调用该方法后,onCancelled()会被执行。注意,cancel()方法只是标记了要取消任务,并不会立即结束任务,要想今早结束任务,可以在doInBackground()方法中使用isCancelled()检查是否取消了任务,如果取消了任务,直接break。
使用时的注意点
若AsyncTask被声明为内部类,则可能会引起内存泄露。应将AsyncTask声明为静态,并使用软引用。在Activity或Fragment销毁时调用cancel(true)取消任务。