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 ...
最新文章
- 脉冲神经网络_【强基固本】脉冲神经网络(SNN)
- python函数中可变参数的传递方式是_Python中函数的参数传递与可变长参数
- JZOJ 3943. 【GDOI2015模拟11.29】环游世界
- 正则表达式--python的re模块
- 【Axure电商原型】电商APP高保真原型+移动端通用版电商app模板+用户中心+会员体系+内容推荐+社区体系+运营推广+订单流程+运营活动+订单管理+售后及服务+秒杀专区+特惠推荐+高保真移动端电商
- 深度剖析 Linux 的 3 种“拷贝”命令
- 对left join on and、left join on where的理解
- JSP标签JSTL(3)--迭代操作
- 《Android内核剖析》读书笔记 第13章 View工作原理【View树遍历】
- Windows系统键盘钩子(原创)
- 计算机专业及课程设置,清华及各大高校公布计算机专业培养方案课程
- mysql数据库备份方法有几种_MySQL数据库备份的几种方式
- freenom域名申请教程
- 自然语言处理领域国内外著名会议和期刊
- 嵌入式系统三级考试终结版2019.3
- 边打游戏边学编程,是一种怎样的体验?
- openssl 1.0.2k-fips 升级到 openssl-3.0.3
- GIC检测中断的流程
- 自动化运维工具Ansible(2)ad-hoc
- 从网页到微信小程序开发:一:小程序与普通网页的区别