AndroidStudio_安卓原生开发_AsyncTask异步处理使用_AsyncTaskLoader---Android原生开发工作笔记139
发布日期:2021-06-29 17:55:40
浏览次数:2
分类:技术文章
本文共 6169 字,大约阅读时间需要 20 分钟。
为什么这里要说一下AsyncTask,因为之前写程序都用Handler来做
上面这样用Handler来做的时候,后来发现,程序运行的过程中,由于线程的问题,出现了一些问题,比如
操作过程中有可能会崩溃等.
用AsyncTask执行,异步操作可能会好一些.android原生提供,执行以后可以通知UI线程更新UI
通过AsyncTask可以实现
- 实现多线程 在工作线程中执行任务,如 耗时任务
- 异步通信、消息传递实现工作线程 & 主线程(
UI
线程)之间的通信,即:将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI
操作,从而保证线程安全 - 可以看看这个AsyncTask类
public abstract class AsyncTask{ ... }// 类中参数为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{ .... // 方法1:onPreExecute() // 作用:执行 线程任务前的操作 // 注:根据需求复写 @Override protected void onPreExecute() { ... } // 方法2:doInBackground() // 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果 // 注:必须复写,从而自定义线程任务 @Override protected String doInBackground(String... params) { ...// 自定义的线程任务 // 可调用publishProgress()显示进度, 之后将执行onProgressUpdate() publishProgress(count); } // 方法3:onProgressUpdate() // 作用:在主线程 显示线程任务执行的进度 // 注:根据需求复写 @Override protected void onProgressUpdate(Integer... progresses) { ... } // 方法4:onPostExecute() // 作用:接收线程任务执行结果、将执行结果显示到UI组件 // 注:必须复写,从而自定义UI操作 @Override protected void onPostExecute(String result) { ...// UI操作 } // 方法5:onCancelled() // 作用:将异步任务设置为:取消状态 @Override protected 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();
- 创建
AsyncTask
子类的实例对象(即 任务实例) - 手动调用
execute(()
从而执行异步线程任务
3.上面是介绍,然后我们再去写个例子去看看:
6. 实例讲解
下面,我将用1个实例讲解 具体如何使用 AsyncTask
6.1 实例说明
- 点击按钮 则 开启线程执行线程任务
- 显示后台加载进度
- 加载完毕后更新UI组件
- 期间若点击取消按钮,则取消加载
如下图
示意图
6.2 具体实现
建议先下载源码再看:
- 主布局文件:activity_main.xml
- 主逻辑代码文件: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{ // 方法1:onPreExecute() // 作用:执行 线程任务前的操作 @Override protected void onPreExecute() { text.setText("加载中"); // 执行前显示提示 } // 方法2:doInBackground() // 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果 // 此处通过计算从而模拟“加载进度”的情况 @Override protected 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() // 作用:在主线程 显示线程任务执行的进度 @Override protected void onProgressUpdate(Integer... progresses) { progressBar.setProgress(progresses[0]); text.setText("loading..." + progresses[0] + "%"); } // 方法4:onPostExecute() // 作用:接收线程任务执行结果、将执行结果显示到UI组件 @Override protected void onPostExecute(String result) { // 执行完毕后,则更新UI text.setText("加载完毕"); } // 方法5:onCancelled() // 作用:将异步任务设置为:取消状态 @Override protected void onCancelled() { text.setText("已取消"); progressBar.setProgress(0); } } @Override protected 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() { @Override public 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() { @Override public void onClick(View v) { // 取消一个正在执行的任务,onCancelled方法将会被调用 mTask.cancel(true); } }); }}
- 运行结果
示意图
- 源码地址
AsyncTaskLoader 这个没有说,这个也是实现的TsyncTask,相当于又封装了一层,用到的时候,
再去看也可以。
技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 CSDN账号:credreamer 开通了个人技术微信公众号:credream,有需要的朋友可以添加相互学习
转载地址:https://credream.blog.csdn.net/article/details/118072359 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月14日 09时16分04秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java程序员从笨鸟到菜鸟全部博客目录
2019-04-30
java程序员从笨鸟到菜鸟之(七)一—java数据库操作
2019-04-30
Java程序员从笨鸟到菜鸟之(八)反射和代理机制
2019-04-30
面试心得与总结—BAT、网易、蘑菇街
2019-04-30
Java对象初始化顺序
2019-04-30
Java开发的几个注意点
2019-04-30
我的Java后端书架 (2016年暖冬4.0版)
2019-04-30
每个程序员都必读的10篇文章
2019-04-30
也谈IO模型
2019-04-30
谈谈互联网后端基础设施
2019-04-30
Mybatis的ResultMap的使用
2019-04-30
Java 异常处理的误区和经验总结
2019-04-30
Chrome控制台使用详解
2019-04-30
Chrome 控制台console的用法(学了之后对于调试js可是大大有用的哦)
2019-04-30
15 个必须知道的 Chrome 开发工具技巧
2019-04-30
推荐的四款产品原型设计工具
2019-04-30
Spring基础知识汇总 Java开发必看
2019-04-30
设计模式(一)工厂模式Factory(创建型)
2019-04-30