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";@Overrideprotected 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() {}@Overridepublic void onClick(View view) {if (view == btnDownload) {MyAsyncTask asyncTask = new MyAsyncTask();asyncTask.execute(url);}}class MyAsyncTask extends AsyncTask<String, String, Bitmap> {@Overrideprotected void onPreExecute() {super.onPreExecute();tvProgress.setText("下载开始");}@Overrideprotected Bitmap doInBackground(String... strings) {publishProgress("正在下载中...");return getBitmapFromUrl(strings[0]);}@Overrideprotected void onProgressUpdate(String... values) {super.onProgressUpdate(values);tvProgress.setText("正在下载中...");}@Overrideprotected 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"><ImageViewandroid: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" /><TextViewandroid: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" /><TextViewandroid: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" /><Buttonandroid: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>
最终的效果图就上我们可爱的刘人语小姐姐吧:
转载于:https://www.cnblogs.com/hxchaoshuai/p/9266389.html
Android 消息异步处理之AsyncTask相关推荐
- android服务绑定异步,Android中异步类AsyncTask用法总结
本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独 ...
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比 标签: AndroidAsyncTaskThreadPool异步加载view 2 ...
- Android消息机制Handler用法
这篇文章介绍了Android消息机制Handler用法总结,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 1.简述 Handler消息机制主要包括: Messa ...
- android cpu调度策略_「性能优化3.0」Android线程调度异步方式汇总
线程调度与线程调度模型 任意时刻,只有一个线程占用 CPU,处于运行状态.而多线程并发执行就是轮流获取 CPU 执行权. 分时调用模型 轮流获取 CPU 执行权,均分 CPU 执行时间. 抢占式调度模 ...
- android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码
提起Android消息机制,想必都不陌生.其中包含三个部分:Handler,MessageQueue以及Looper,三者共同协作,完成消息机制的运行.本篇文章将由浅入深解析Android消息机制的运 ...
- Android消息通信之无所不能的第三方开源项目EventBus
Android消息通信之无所不能的第三方开源项目EventBus 在Android开发中,消息通信在开发过程中是比较重要但比较略微繁琐的过程,比如,Activity与Fragment之间的消息通 ...
- Android Loader 异步加载详解二:探寻Loader内部机制
Android Loader 异步加载详解二:探寻Loader内部机制 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/7025991 ...
- Android Loader 异步加载详解一:基础概念
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70241844 本文出自[赵彦军的博客] Android Loader 异步加载详解 ...
- 理解 Android 消息机制
本人只是Android小菜一个,写技术文章只是为了总结自己最近学习到的知识,从来不敢为人师,如果里面有不正确的地方请大家尽情指出,谢谢! 本文基于原生 Android 9.0 源码来解析 Androi ...
最新文章
- HTTP 加速器 Varnish
- GIVE_A_TRY.exe 逆向(NCK逆向初级第9,10,11课作业)
- navicat快捷键
- boost::detail模块实现宏IS_SORTED的测试程序
- h700通话糊 索尼wi_专业的事还是要交给专业的人,盘点索尼千元以下的好耳机...
- linux 内核重定位,Linux 内核学习笔记:预备知识之“目标文件”
- 3D-BoNet:比3D点云实例分割算法快10倍!代码已开源
- java volatile实例_Java的Volatile实例用法及讲解
- Java并发编程-八锁问题带你彻底理解对象锁和类锁
- java1.7数据库access_Java 8读取Access数据库报错的问题——用32位Java 7
- 计算机知识选择题库,计算机基础知识篇选择题库
- 用protobuf进行C#与Java通信
- Verilog语法之generate语句
- 趣头条“瘦身”减负?
- Python海龟Turtle的使用画中秋画的方法详细讲解
- 图片太大怎么改小kb?简单的图片压缩方法分享
- nginx - nginx的安装部署
- 智能巡检系统:企业安全生产管理的智能助手
- 用C语言写的学生管理系统,C语言实现简单的学生成绩管理系统
- 基于Java的Socket实现TCP连接