zoukankan      html  css  js  c++  java
  • Android 消息异步处理之AsyncTask

    Android提供了异步处理消息的方式大致有两种,第一种是handler+Thread,之前已经对于这种方式做过分析,第二种就是AsyncTask,这是Android1.5提供的一种轻量级的工具类,其本质也是对handler和Thread进行了封装适用于一些简单的异步处理。

    AsyncTask是一个抽象类,我们需要继承他并实现他的方法,其中有4个方法比较重要,对应着异步处理的几个过程。分别是:

    • onPreExecute()

    • doInBackground(Params... var1)
    • onProgressUpdate(Progress... values)
    • protected void onPostExecute(Result result)

    这四个方法的一些参数和返回值都是基于泛型的,而且泛型的类型还不一样,所以在AsyncTask的使用中会遇到三种泛型参数:Params, Progress 和 Result。
    • Params表示用于AsyncTask执行任务的参数的类型
    • Progress表示在后台线程处理的过程中,可以阶段性地发布结果的数据类型
    • Result表示任务全部完成后所返回的数据类型

    我们通过调用asynctask的excute()方法就可以执行异步任务,会按照如上的顺序执行,下面依次来介绍一下这几个方法。

    onPreExecute()

    在执行任务之前在UI线程上调用。此步骤通常用于设置任务,例如通过在用户界面中显示进度条。

    doInBackground(Params... var1)

    onPreExecute()完成执行后立即在后台线程上调用此步骤用于执行可能需要很长时间的后台计算。异步任务的参数将传递给此步骤。计算结果必须由此步骤返回,并将传递回最后一步。此步骤还可用于publishProgress(Progress...)发布一个或多个进度单位。这些值在onProgressUpdate(Progress...)步骤中发布在UI线程上 

    onProgressUpdate(Progress... values)

    在调用后在UI线程上调用publishProgress(Progress...)执行的时间是不确定的,如果在doInBackground中多次调用了publishProgress方法,那么主线程就会多次回调onProgressUpdate方法。此方法用于在后台计算仍在执行时显示用户界面中的任何形式的进度。例如,它可用于为进度条设置动画或在文本字段中显示日志。

    protected void onPostExecute(Result result)

    在后台计算完成后在UI线程上调用。doInBackground计算的结果作为参数传递给该步骤。

    下面通过一个小demo来实现一下:

    package com.hxc.supreme.activity;
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.hxc.supreme.R;
    import com.hxc.supreme.fragment.QuickControlFragment;
    
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    /**
     * created by huxc  on 2017/9/28.
     * func:asynctask异步下载
     * email: hxc242313@qq.com
     */
    
    public class AsyncTaskActivity extends AppCompatActivity implements View.OnClickListener {
    
        private Button btnDownload;
        private ImageView ivImage;
        private TextView tvProgress;
        private final String url = "http://i10.hoopchina.com.cn/hupuapp/bbs/741/36556741/thread_4847_36556741_20180619162627_83601.jpg?x-oss-process=image/resize,w_800/format,jpg";
    
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_asynctask);
            initView();
            initListener();
            initData();
        }
    
        protected void initView() {
            btnDownload = (Button) findViewById(R.id.btn_download);
            ivImage = (ImageView) findViewById(R.id.iv_image);
            tvProgress = (TextView) findViewById(R.id.tv_progress);
        }
    
        protected void initListener() {
            btnDownload.setOnClickListener(this);
        }
    
        protected void initData() {
    
        }
    
        @Override
        public void onClick(View view) {
            if (view == btnDownload) {
                MyAsyncTask asyncTask = new MyAsyncTask();
                asyncTask.execute(url);
            }
        }
    
    
        class MyAsyncTask extends AsyncTask<String, String, Bitmap> {
    
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                tvProgress.setText("下载开始");
            }
    
            @Override
            protected Bitmap doInBackground(String... strings) {
                publishProgress("正在下载中...");
                return getBitmapFromUrl(strings[0]);
            }
    
            @Override
            protected void onProgressUpdate(String... values) {
                super.onProgressUpdate(values);
                tvProgress.setText("正在下载中...");
            }
    
            @Override
            protected void onPostExecute(Bitmap bitmap) {
                super.onPostExecute(bitmap);
                ivImage.setImageBitmap(bitmap);
                tvProgress.setText("下载结束");
            }
        }
    
        public Bitmap getBitmapFromUrl(String urlString) {
            Bitmap bitmap;
            InputStream is = null;
    
            try {
                URL url = new URL(urlString);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                is = new BufferedInputStream(connection.getInputStream());
                bitmap = BitmapFactory.decodeStream(is);
                connection.disconnect();
                return bitmap;
    
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    
    
    }

    布局也很简单就一个button、imageview、TextView

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <ImageView
            android:id="@+id/iv_image"
            android:layout_width="300dp"
            android:layout_height="400dp"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="20dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <TextView
            android:id="@+id/tv_pro"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="当前下载进度:"
            app:layout_constraintLeft_toLeftOf="@+id/iv_image"
            app:layout_constraintTop_toBottomOf="@+id/iv_image" />
    
        <TextView
            android:id="@+id/tv_progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            app:layout_constraintLeft_toRightOf="@+id/tv_pro"
            app:layout_constraintTop_toTopOf="@+id/tv_pro" />
    
        <Button
            android:id="@+id/btn_download"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_margin="20dp"
            android:background="@drawable/shape_config_btn_bg"
            android:text="开始下载"
            app:layout_constraintBottom_toBottomOf="parent" />
    
    </android.support.constraint.ConstraintLayout>

    最终的效果图就上我们可爱的刘人语小姐姐吧:

         

     
  • 相关阅读:
    微信小程序常用表单校验方法(手机号校验、身份证号(严格和非严格校验、验证码六位数字校验))
    css使Img图片居中显示
    formData请求接口传递参数格式
    台式机如何无线上网的解决方法
    (转译)2019年WEB漏洞扫描工具和软件前十名推荐
    如何往虚拟机内传文件的3种方法
    Python3.X Selenium 自动化测试中如何截图并保存成功
    postman如何绕过登录账户和密码验证,进行接口测试的方法
    官网Windows 10安装程序驱动下载--截止:2019.01.06版本
    postman教学视频百度网盘转载分享
  • 原文地址:https://www.cnblogs.com/hxchaoshuai/p/9266389.html
Copyright © 2011-2022 走看看