Android 处理耗时操作之二------AsyncTask

孤街浪徒 提交于 2019-12-03 11:54:22

为了更方便的处理一些耗时操作,android提供了一些好用的工具,比如AsyncTask。借助这个就可以简单的从子线程切换到主线程。

当然这个工具也是基于异步消息处理机制的,只是安卓做了很好的封装。

首先要说明的是AsyncTask是一个抽线类,要使用它,就必须先创建一个子类再去实现实现相关功能

该抽象类的声明如下

public abstract class AsyncTask<Params, Progress, Result> 

Params:开始异步任务执行时传入的参数类型;

Progress:异步任务执行过程中,返回下载进度值的类型;

Result:异步任务执行完成后,返回的结果类型;

一个简单的自定义类可以这么写

class MyTask extends AsyncTask<Void, Integer, Boolean>

这里将传入参数设置为空,是因为我们暂时不需要传入参数给后台任务

当然现在的我们自定义的类还只能算是一个空任务,内在并没有什么逻辑。为了能让我们的自定义类担当大任我们还需要重写几个方法

1.onPreExecute()

这个方法会在后台任务开始执行之间调用,在主线程执行。用于进行一些界面上的初始化操作,比如显示一个进度条对话框等。

2.doInBackground(Params)

这个方法中的所有代码都会在子线程中运行。任务完成后再通过return语句将任务结果返回。注意这里并不能进行UI操作。如果说需要反馈当前任务的执行进度,可以调用publishProgress(Progress...)方法来完成。

3.onProgressUpdate(Progress...)

当在后台任务中调用了publishProgress(Progress...)方法后,这个方法就很快会被调用,方法中携带的参数就是在后台任务中传递过来的。在这个方法中可以对UI进行操作。

4.onPostExecute(Result)

当任务执行完毕并通过return返回后,该方法就会被调用。可以通过返回的数据进行UI操作。

class MyTask 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();  
        }  
    }  
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!