Android AsyncTask基础知识整理

2018-04-08  本文已影响0人  呱呱_

一、AsyncTask的简介

AsyncTask是一个抽象泛型类,它是由Android封装的轻量级异步类(使用方便、代码简介),它可以在线程中执行后台任务,然后将执行的结果以及进度传递给主线程,并在主线程更新UI。

AsyncTask内部封装了两个线程池(SerialExecutor和THREAD_POOL_EXECUTOR)和一个Handler(InternalHandler)。

二、AsyncTask的泛型参数

public abstract class AsyncTask<Params, Progress, Result> 

如果AsyncTask确定不需要传递具体的参数,那么这三个泛型参数可以用Void代替。

三、AsyncTask的核心方法

onPreExecute()

doInBackground(Params...)

onProgressUpdate(Progress...)

onPostExecute(Result)

上述方法执行顺序:
onPreExecute() --> doInBackground() --> publishProgress() --> onProgressUpdate() --> onPostExecute()

如果不需要执行更新进度,则:
onPreExecute() --> doInBackground() --> onPostExecute()

AsyncTask还提供了cancel(boolean)方法,用于取消异步任务,在主线程中调用。当cancel(boolean)被调用时,onPostExecute()则不被调用,将会调用onCancelled()方法。但并不是真正的取消任务,只是设置了这个任务为取消状态,我们需要在doInBackground()判断终止任务。

四、AsyncTask的简单使用

class DownloadTask extends AsyncTask<Void, Integer, Boolean> {  
  
    @Override  
    protected void onPreExecute() {  
        progressDialog.show();  
    }  
  
    @Override  
    protected Boolean doInBackground(Void... params) {  
        try {  
            while (true) {  
                int downloadPercent = doDownload();  
                publishProgress(downloadPercent);  
                if (downloadPercent >= 100) {  
                    break;  
                }  
            }  
        } catch (Exception e) {  
            return false;  
        }  
        return true;  
    }  
  
    @Override  
    protected void onProgressUpdate(Integer... values) {  
        progressDialog.setMessage("当前下载进度:" + values[0] + "%");  
    }  
  
    @Override  
    protected void onPostExecute(Boolean result) {  
        progressDialog.dismiss();  
        if (result) {  
            Toast.makeText(context, "下载成功", Toast.LENGTH_SHORT).show();  
        } else {  
            Toast.makeText(context, "下载失败", Toast.LENGTH_SHORT).show();  
        }  
    }  
}

这里模仿下载任务,doInBackground()执行下载逻辑,onProgressUpdate()显示当前下载进度,onPostExecute()提示任务执行结果。
如果启动任务,只需调用以下代码:

new DownloadTask().execute();  

五、AsyncTask的使用注意事项

六、AsyncTask的缺陷

生命周期:

内存泄漏:

cancel(boolean)不一定好使:

结果丢失:

串行还是并行:

七、AsyncTask与Handler的关系

至于AsyncTask的源码理解,等以后理解了,再补上,再次留下了没技术的眼泪~
最后奉上参考博文,毕竟东拼西凑(捂脸):
Android中的线程状态之AsyncTask详解
AsyncTask 使用和缺陷

上一篇下一篇

猜你喜欢

热点阅读