Android异步消息处理机制之AsyncTask异步任务,文件下载及进度条的更新

2 篇文章 0 订阅
1 篇文章 0 订阅


前言

为了更加方便我们在子线程中进行ui操作,Android还专门提供了一个更加好的工具,AsyncTask,见名知意,这是一个异步任务。可以非常简单的由子线程切换到主线程,即使你不明白异步消息的处理机制。

一、AsyncTask简介

AsyncTask实现原理也是异步消息处理机制

AsyncTask是一个抽象类 使用的时候需要去实现它

如上图有三个泛型参数分别是:

(1).params 执行AsyncTask时需要传入的参数,用于后台任务使用

(2).progress 后台执行任务时,如果界面需要显示当前进度,使用指定的泛型做单位

(3).result 任务执行完毕 需要对结果进行返回,使用这里的泛型作为结果的返回类型

经常需要重写的方法

1.onPreExecute()

这个方法会在任务执行之前调用,用于对界面的一些初始化。如:显示一个进度条

2.doInBackground(Params....)

这个方法的所有代码会在子线程运行,处理耗时任务,任务执行完成,如果第三个参数不是void,通过 return 来返回结果。注意这个方法不能进行ui操作,如果要更新ui,要调用publishProgress().

3.onProgressUpdate(Progress...)

当publishProgress()被调用,onProgressUpdate()也马上调用,这里对ui进行操作。

4.onPostExecute(Result)

当后台任务执行完毕,return返回结果作为参数,这个方法马上调用,返回的数据进行ui操作

二、AsyncTask使用步骤

用异步任务实现一个进度条

首先布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">


    <SeekBar
        android:id="@+id/sk"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:max="100" />

    <Button
        android:id="@+id/btn1_progress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始下载1"/>
    <Button
        android:id="@+id/begin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始"/>

MainActivity

public class MainActivity extends AppCompatActivity {
    private  Button button;
    private SeekBar seekBar;
    private Button button1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.begin);
        button1 = findViewById(R.id.btn1_progress);
        seekBar = findViewById(R.id.sk);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new DownloadTask(seekBar,button1).execute(); //启动异步任务
            }
        });


    }

异步任务

class DownloadTask extends AsyncTask<String,Integer,String>{
    private Button button;
    private SeekBar seekBar;
    DownloadTask(SeekBar seekBar,Button button){    //通过构造 把activitiy的活动button 和 seekar 传入异步任务
        this.seekBar= seekBar;
        this.button=button;
    }


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //button = button.findViewById(R.id.btn1_progress);
        //seekBar = seekBar.findViewById(R.id.sk);
        button.setText("下载中");   //界面初始化
    }

    @Override
    protected String doInBackground(String... strings) {   //假设处理文件下载的耗时任务
        int current=0;
        //处理文件下载任务
        do {
            current+=10;
            publishProgress(current);    //需要改变ui  调用此方法
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }while (seekBar.getProgress()<=100);
        return "结果";
    }

    @Override
    protected void onProgressUpdate(Integer... values) {   //执行改变ui操作  
        super.onProgressUpdate(values);
        seekBar.setProgress(values[0]);
        if (seekBar.getProgress()==100){
            button.setText("下载完成");
        }
    }
}

真机效果演示


 

总结

主要对AsyncTask的参数,需要重写方法做了接单的介绍。最后用异步任务首先了一个简单的截图条功能,改变Button的text。这样更加理解AsyncTask的使用和理解。

tip:这只是我的一家之言,有错误的地方欢迎指正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值