AsyncTask异步任务

1.问题
(1)什么是AsyncTask?
一个Android 已封装好的轻量级异步类,属于抽象类,即使用时需 实现子类。
(2)AsyncTask如何使用?
创建 AsyncTask 子类 并重写核心方法,接着创建 AsyncTask子类的实例对象,最后调用execute(()从而执行异步线程任务
2.异步任务常用方法
(1)onPreExecute():执行 线程任务前的操作
(2)doInBackground():接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果
(3)onProgressUpdate():在主线程 显示线程任务执行的进度
(4)onPostExecute():接收线程任务执行结果、将执行结果显示到UI组件
(5)onCancelled():将异步任务设置为:取消状态
3.
异步下载的实现

3.1实现步骤
(1)权限申请,网络权限,读写外部存储权限
(2)布局
(3)下载前做什么(UI是怎样的)
(4)下载中做什么(UI有没有变化)
(5)下载后做什么(UI该变成哪样)
3.2代码演示
(1)权限申请

 <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

(2)布局android:layout_marginTop=“15dp”
在这里插入图片描述
(3)初始化视图initView();设置点击监听setListener();初始化UI数据 setData();
(4)下载前onPreExecute()(在UI线程中)
设置进度条,Buton,TextView

protected void onPreExecute() {
            super.onPreExecute();
            mDownloadButton.setText(R.string.downloading);
            mResultTextView.setText(R.string.downloading);
            mProgressBar.setProgress(INIT_PROGRESS);
        }

(5)下载过程中(另一个线程中)

protected Boolean doInBackground(String... params) {
  
                String apkUrl = params[0];          
                URL url = new URL(apkUrl);
                URLConnection urlConnection = url.openConnection();
                InputStream inputStream = urlConnection.getInputStream();

                // 获取了下载内容的总长度
                int contentLength = urlConnection.getContentLength();

                // 下载地址准备
                mFilePath = Environment.getExternalStorageDirectory()
                        + File.separator + FILE_NAME;           

                // 已下载的大小
                int downloadSize = 0;
            
                byte[] bytes = new byte[1024];
                int length;

                // 创建一个流
                OutputStream outputStream = new FileOutputStream(mFilePath);
                
                // 不断把内存的文件流写到目标文件中
                while ((length = inputStream.read(bytes)) != -1){
                    // 挖到的放到我们的文件管道里
                    outputStream.write(bytes, 0, length);
                    // 累加我们的大小
                    downloadSize += length;
                    // 发送进度
                    publishProgress(downloadSize * 100/contentLength);                              

(5)下载完成后(UI线程)

protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            // 在主线程中 ,执行结果 处理
            mDownloadButton.setText(result? getString(R.string.download_finish) : getString(R.string.download_finish));
            mResultTextView.setText(result? getString(R.string.download_finish) + mFilePath: getString(R.string.download_finish));
        }

        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            // 收到进度,然后处理: 也是在UI线程中。
            if (values != null && values.length > 0) {
                mProgressBar.setProgress(values[0]);
            }
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值