美文网首页我爱编程
android 多线程 — AsyncTask 使用

android 多线程 — AsyncTask 使用

作者: 前行的乌龟 | 来源:发表于2018-05-28 01:56 被阅读56次

    AsyncTask android 提供的典型的用来实现异步任务的类,直接来看如何使用

    如何使用


    1. AsyncTask 是一个 abstract 抽象基类,我们必须写一个异步任务类继承 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();
            }
        }
    }
    
    1. 在 UI 线程中,new 一个这个 AsyncTask 实现类的对象,然后启动
    new DownloadTask().execute();
    

    类声明中的泛型解释


    在我们声明这个 DownloadTask 继承 AsyncTask 类的时候,有3个泛型

    class DownloadTask extends AsyncTask<Void, Integer, Boolean>{
    ....
    }
    
    1. 第一个泛型 : 表示传入的原始参数类型

    2. 第一个泛型 : 表示后台任务中间执行进度的数据类型,比如可以用在下载中

    3. 第一个泛型 : 表示最终返回结果的数据类型

    4. 若是没有参数:那么在相应位置可以写 Void

    方法解释


    1. onPreExecute()
      代理 相关的准备任务,运行在 UI 线程,在后台任务前运行。

    2. doInBackground(Params)
      代理 异步任务,运行在独立的线程中,期中可以使用 publishProgress(downloadPercent) 方法更新任务进度,比如下载任务,最后把获取都的数据返回, 没有返回 null

    3. onProgressUpdate(Progress...)
      用于更新进度,运行在 UI 线程

    4. onPostExecute(result)
      获取最终结果,运行在 UI 线程

    不墨迹,AsyncTask 就这么多,上面的知道了就会用了,下面有一些注意点:

    • AsyncTask 的实例必须在UI 线程中创建
    • execute方法必须在UI 线程中调用
    • 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,没意义不会按我们想的去执行,他们都是作为回调函数在相应的位置执行才有效
    • AsyncTask 对象只能被执行一次,否则多次调用时将会出现异常

    相关文章

      网友评论

        本文标题:android 多线程 — AsyncTask 使用

        本文链接:https://www.haomeiwen.com/subject/sqcwjftx.html