为什么这里要说一下AsyncTask,因为之前写程序都用Handler来做

上面这样用Handler来做的时候,后来发现,程序运行的过程中,由于线程的问题,出现了一些问题,比如

操作过程中有可能会崩溃等.

用AsyncTask执行,异步操作可能会好一些.android原生提供,执行以后可以通知UI线程更新UI

通过AsyncTask可以实现

  1. 实现多线程
    在工作线程中执行任务,如 耗时任务
  2. 异步通信、消息传递
    实现工作线程 & 主线程(UI线程)之间的通信,即:将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作,从而保证线程安全
  3. 可以看看这个AsyncTask类
public abstract class AsyncTask<Params, Progress, Result> { ...
}// 类中参数为3种泛型类型
// 整体作用:控制AsyncTask子类执行线程任务时各个阶段的返回类型
// 具体说明:// a. Params:开始异步任务执行时传入的参数类型,对应excute()中传递的参数// b. Progress:异步任务执行过程中,返回下载进度值的类型// c. Result:异步任务执行完成后,返回的结果类型,与doInBackground()的返回值类型保持一致
// 注:// a. 使用时并不是所有类型都被使用// b. 若无被使用,可用java.lang.Void类型代替// c. 若有不同业务,需额外再写1个AsyncTask的子类
}

4.他有以下的方法

5.然后调用顺序是这样的:

然后我们去写一个例子看看

1.创建 AsyncTask 子类 & 根据需求实现核心方法

/*** 步骤1:创建AsyncTask子类* 注: *   a. 继承AsyncTask类*   b. 为3个泛型参数指定类型;若不使用,可用java.lang.Void类型代替*   c. 根据需求,在AsyncTask子类内实现核心方法*/private class MyTask extends AsyncTask<Params, Progress, Result> {....// 方法1:onPreExecute()// 作用:执行 线程任务前的操作// 注:根据需求复写@Overrideprotected void onPreExecute() {...}// 方法2:doInBackground()// 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果// 注:必须复写,从而自定义线程任务@Overrideprotected String doInBackground(String... params) {...// 自定义的线程任务// 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()publishProgress(count);}// 方法3:onProgressUpdate()// 作用:在主线程 显示线程任务执行的进度// 注:根据需求复写@Overrideprotected void onProgressUpdate(Integer... progresses) {...}// 方法4:onPostExecute()// 作用:接收线程任务执行结果、将执行结果显示到UI组件// 注:必须复写,从而自定义UI操作@Overrideprotected void onPostExecute(String result) {...// UI操作}// 方法5:onCancelled()// 作用:将异步任务设置为:取消状态@Overrideprotected void onCancelled() {...}}/*** 步骤2:创建AsyncTask子类的实例对象(即 任务实例)* 注:AsyncTask子类的实例必须在UI线程中创建*/MyTask mTask = new MyTask();/*** 步骤3:手动调用execute(Params... params) 从而执行异步线程任务* 注:*    a. 必须在UI线程中调用*    b. 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常*    c. 执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute() *    d. 不能手动调用上述方法*/mTask.execute();
  1. 创建 AsyncTask子类的实例对象(即 任务实例)
  2. 手动调用execute(()从而执行异步线程任务

3.上面是介绍,然后我们再去写个例子去看看:

6. 实例讲解

下面,我将用1个实例讲解 具体如何使用 AsyncTask

6.1 实例说明

  1. 点击按钮 则 开启线程执行线程任务
  2. 显示后台加载进度
  3. 加载完毕后更新UI组件
  4. 期间若点击取消按钮,则取消加载

如下图

示意图

6.2 具体实现

建议先下载源码再看:Carson_Ho的Github地址:AsyncTask

  • 主布局文件:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"android:gravity="center"tools:context="com.example.carson_ho.handler_learning.MainActivity"><Buttonandroid:layout_centerInParent="true"android:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="点我加载"/><TextViewandroid:id="@+id/text"android:layout_below="@+id/button"android:layout_centerInParent="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="还没开始加载!" /><ProgressBarandroid:layout_below="@+id/text"android:id="@+id/progress_bar"android:layout_width="fill_parent"android:layout_height="wrap_content"android:progress="0"android:max="100"style="?android:attr/progressBarStyleHorizontal"/><Buttonandroid:layout_below="@+id/progress_bar"android:layout_centerInParent="true"android:id="@+id/cancel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="cancel"/>
</RelativeLayout>
  • 主逻辑代码文件:MainActivity.java
public class MainActivity extends AppCompatActivity {// 线程变量MyTask mTask;// 主布局中的UI组件Button button,cancel; // 加载、取消按钮TextView text; // 更新的UI组件ProgressBar progressBar; // 进度条/*** 步骤1:创建AsyncTask子类* 注:*   a. 继承AsyncTask类*   b. 为3个泛型参数指定类型;若不使用,可用java.lang.Void类型代替*      此处指定为:输入参数 = String类型、执行进度 = Integer类型、执行结果 = String类型*   c. 根据需求,在AsyncTask子类内实现核心方法*/private class MyTask extends AsyncTask<String, Integer, String> {// 方法1:onPreExecute()// 作用:执行 线程任务前的操作@Overrideprotected void onPreExecute() {text.setText("加载中");// 执行前显示提示}// 方法2:doInBackground()// 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果// 此处通过计算从而模拟“加载进度”的情况@Overrideprotected String doInBackground(String... params) {try {int count = 0;int length = 1;while (count<99) {count += length;// 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()publishProgress(count);// 模拟耗时任务Thread.sleep(50);}}catch (InterruptedException e) {e.printStackTrace();}return null;}// 方法3:onProgressUpdate()// 作用:在主线程 显示线程任务执行的进度@Overrideprotected void onProgressUpdate(Integer... progresses) {progressBar.setProgress(progresses[0]);text.setText("loading..." + progresses[0] + "%");}// 方法4:onPostExecute()// 作用:接收线程任务执行结果、将执行结果显示到UI组件@Overrideprotected void onPostExecute(String result) {// 执行完毕后,则更新UItext.setText("加载完毕");}// 方法5:onCancelled()// 作用:将异步任务设置为:取消状态@Overrideprotected void onCancelled() {text.setText("已取消");progressBar.setProgress(0);}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 绑定UI组件setContentView(R.layout.activity_main);button = (Button) findViewById(R.id.button);cancel = (Button) findViewById(R.id.cancel);text = (TextView) findViewById(R.id.text);progressBar = (ProgressBar) findViewById(R.id.progress_bar);/*** 步骤2:创建AsyncTask子类的实例对象(即 任务实例)* 注:AsyncTask子类的实例必须在UI线程中创建*/mTask = new MyTask();// 加载按钮按按下时,则启动AsyncTask// 任务完成后更新TextView的文本button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {/*** 步骤3:手动调用execute(Params... params) 从而执行异步线程任务* 注:*    a. 必须在UI线程中调用*    b. 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常*    c. 执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute()*    d. 不能手动调用上述方法*/mTask.execute();}});cancel = (Button) findViewById(R.id.cancel);cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 取消一个正在执行的任务,onCancelled方法将会被调用mTask.cancel(true);}});}}
  • 运行结果

示意图

  • 源码地址
    Carson_Ho的Github地址:AsyncTask

链接:https://www.jianshu.com/p/ee1342fcf5e7

AsyncTaskLoader 这个没有说,这个也是实现的TsyncTask,相当于又封装了一层,用到的时候,

再去看也可以。

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 CSDN账号:credreamer 开通了个人技术微信公众号:credream,有需要的朋友可以添加相互学习

AndroidStudio_安卓原生开发_AsyncTask异步处理使用_AsyncTaskLoader---Android原生开发工作笔记139相关推荐

  1. 跨平台应用开发进阶(八) :uni-app 实现Android原生APP-云打包集成极光推送(JG-JPUSH)详细教程

    文章目录 一.前言 二.资源 三.集成 3.1 SDK 引入 3.2 代码集成 3.3 遇到的问题及解决方案 3.3.1 包大小限制 3.3.2 [JS Framework] 当前运行的基座不包含原生 ...

  2. android开发培训大纲,华图教育-Android应用开发培训教学大纲

    Android应用开发工程师课程大纲 阶段一:Java语言和编程(25天) 目标: Java语言是Android应用开发的基础.本课程将从基本的Java语法开始,并通过一个SuperQQ项目,让学员掌 ...

  3. libgdx开发指南_使用libgdx进行Android游戏开发–一天中的原型,第1a部分

    libgdx开发指南 在本文中,我将绕开游戏引擎和组件的构建模块,并演示如何使用libgdx库快速制作游戏原型. 您将学到什么: 创建一个非常简单的2D Shooter Platformer游戏. 完 ...

  4. android应用开发大赛,喜讯:我院首届“Android应用开发大赛”圆满落幕

    原标题:喜讯:我院首届"Android应用开发大赛"圆满落幕 为了加强我校学生的专业知识技能与创新能力,让更多的同学能够深入了解互联网文化,同时为计算机相关专业提供一个交流的平台. ...

  5. AndroidStudio_安卓原生开发_什么是AndroidStudio NDK ---Android原生开发工作笔记140

    今天在androidstudio的配置页面,看到了一个NDK Version 都没用过这个NDK,这个NDK是什么呢?来了解一下吧. 1.NDK是一系列工具的集合. NDK提供了一系列的工具,帮助开发 ...

  6. AndroidStudio_安卓原生开发_v4v7升级到androidx方法---Android原生开发工作笔记147

    自己的程序版本太久了,导致要集成进一些网路上找的自定义控件等都集成不进来...就升级了: 1.首先在项目的: TestApp\gradle.properties 文件中: 添加 # 表示使用 andr ...

  7. AndroidStudio_安卓原生开发_Android中使用HttpURLConnection发送同步Post请求_json数据到springBoot后台---Android原生开发工作笔记139

    这里要注意如果想发送同步请求,而不报错需要在oncreate方法中加上 if (android.os.Build.VERSION.SDK_INT > 9) {StrictMode.ThreadP ...

  8. AndroidStudio安卓原生开发_打包apk安装文件---Android原生开发工作笔记130

    先保证自己的代码没有错误,然后点击上面的按钮进行打包就可以了. 打完包以后会有提示,点击这个locate. 如果弹框消失了,在event log中能找到.

  9. 以下未发布-Android的多线程以及异步消息处理机制,android移动开发基础案例教程源码

    1.Message: Message 是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间进行数据交换.除了 what 字段,还可以使用 arg1 和 arg2 来携带整型数据,使用 ...

最新文章

  1. Verdi-ug --- nschema Tutorial
  2. 关于SAP的“Sort key 排序码”
  3. java mysql 线程安全_java连接mysql的线程安全问题
  4. 异步接口同步返回_同步|异步
  5. CISCO 3560配置作为DHCP服务器
  6. Flutter1.12与原生Android交互(kotlin)
  7. UVAL - 6755 - Swyper Keyboard
  8. 彻底删除 mysql 5.7_Ubuntu16.04彻底删除MySQL5.7
  9. linux修改密码的几种方法
  10. 运维利器screen
  11. 格式化一个文件的大小(size),或者说是格式化一个app的大小(size)
  12. 在Html5中与服务器交互
  13. 嵌入式Linux/Android疑难杂症工作笔记
  14. 基于html制作一个介绍自己家乡的网站,排版整洁,内容丰富,主题鲜明
  15. LintCode 交叉字符串
  16. dota2连接服务器没有响应,win10系统dota2无法与任何服务器建立连接的解决方法
  17. 解决invalid operands of types ‘float‘ and ‘int‘ to binary ‘operator %
  18. 生活中的十大心理学现象
  19. 添加Nginx ALG模块支持FTP协议ALG
  20. 牛客练习赛53 老瞎眼 pk 小鲜肉[思维+离线+线段树]

热门文章

  1. bigru参数计算_[数据挖掘]华中科技大学 李黎 周达明:基于CNN-BiGRU模型的操作票自动化校验方法...
  2. shell调用python脚本传递命名关键字参数_关于python:将字典作为关键字参数传递给函数...
  3. 视图单行子查询返回mysql,Oracle命令整理 - osc_sj1kgo4z的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. STM32复位源判断
  5. Linux下tar压缩与解压缩文件
  6. 【Machine Learning 六】梯度下降法(基于Matlab 求函数最小值)
  7. VS2008无法下断点调试的原因
  8. Leetcode 俄罗斯套娃信封问题
  9. 浏览器执行机制探究,图解最直观
  10. CentOS 7 安装VirtualBox