安卓——异步任务AsyncTask

异步任务:是一个在后台线程上运行,其结果是在UI线程上显示的一种类执行过程如图分为四步:实现AsyncATask子类并创建对象通过execute()方法启动子线程onPreExecute()和inPostExecute方法不是必须重新,会在doInBackground()方法前后执行doInBackground是真正执行子线程逻辑的方法注:doInBackground()也是不能执行UI的,执行UI线程的方法需要放在onProgressUpdate()方法中,执行
摘要由CSDN通过智能技术生成

异步任务:是一个在后台线程上运行,其结果是在UI线程上显示的一种类


执行过程如图

在这里插入图片描述

分为四步:

  1. 实现AsyncATask子类并创建对象

  2. 通过execute()方法启动子线程

  3. onPreExecute()和inPostExecute方法不是必须重新,会在doInBackground()方法前后执行

  4. doInBackground是真正执行子线程逻辑的方法

注:

  1. doInBackground()也是不能执行UI的,执行UI线程的方法需要放在onProgressUpdate()方法中,执行的方法是在doInBackground中调用publishProgress()

  2. 实现AsyncTask子类需要注意的地方:继承时注意泛型,有三个泛型,顺序如下

    • 传递到执行代码中的参数类型
    • 在doInBackground中传递到onProgressUpdate中的参数类型
    • doInBackground返回值类型,也是onPostExecute接收的参数类型

代码

创建:execute中的参数为传递到doInBackground中的

		//启动异步任务
        MyAsyncTask myAsyncTask = new MyAsyncTask();
        myAsyncTask.execute("访问的网络地址");//参数的值会传入doInBackgroud方法

实现AsyncTask子类

 //定义异步任务类,继承自AsyncTask类
    //如果不指定泛型类型,方法中所有的形参和返回值类型都是Object
    private class MyAsyncTask extends AsyncTask<String, Integer, String>{

        @Override
        protected void onPreExecute() {
            Log.e("onPreExecute","所在的线程"+Thread.currentThread().getName());
            super.onPreExecute();
        }

        @Override
        //必须重写的方法
        protected String doInBackground(String[] objects) {
            Log.e("doInBackground","所在的线程"+Thread.currentThread().getName());
            Log.e("主线程传递的数据",objects[0]);

            while (true) {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                publishProgress(20);//每隔2s执行一次onProgressUpdate方法,更新进度条
                if (currentProgress == 80){
                    break;
                }
            }
//            publishProgress();//会执行onProgressUpdate方法
            return "doInBackground执行的结果";
        }

        @Override
        protected void onProgressUpdate(Integer[] values) {
            Log.e("onProgressUpdate","所在的线程"+Thread.currentThread().getName());
            Log.e("onProgressUpdate参数的值",values[0] + "");
            //获取进度条的当前进度
            currentProgress = progressBar.getProgress();
            progressBar.setProgress(currentProgress + 20);
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(String o) {
            Log.e("onPostExecute","所在的线程"+Thread.currentThread().getName());
            Log.e("onPostExecute参数的值",o);//o是doInBackgroud方法的返回值
            super.onPostExecute(o);
        }
    }

可以在异步任务中模拟下载的进度条

简单实现需要五步:

  1. 在XML文件中搞一个ProgressBar组件

  2. 在java代码中获取ProgressBar的组件

  3. 设置其最大值(setMax)

  4. 得到当前进度(getProgress)

  5. 设置进度(setProgress)

有以下几点需要注意:

  1. XML中注意style样式
  2. setMax时候如果设置为100,然后设置进度为50,进度条会显示一半,但如果setMax设为50,设置进度也为50,进度条会显示满

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值