AndroidStudio_安卓原生开发_AsyncTask异步处理使用_AsyncTaskLoader---Android原生开发工作笔记139
发布日期:2021-06-29 17:55:40 浏览次数:2 分类:技术文章

本文共 6169 字,大约阅读时间需要 20 分钟。

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

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

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

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

通过AsyncTask可以实现

  1. 实现多线程
    在工作线程中执行任务,如 耗时任务
  2. 异步通信、消息传递
    实现工作线程 & 主线程(UI线程)之间的通信,即:将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作,从而保证线程安全
  3. 可以看看这个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();

 

  1. 创建 AsyncTask子类的实例对象(即 任务实例)
  2. 手动调用execute(()从而执行异步线程任务

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

6. 实例讲解

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

6.1 实例说明

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

如下图

 

示意图

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); } }); }}
  • 运行结果
  •  

 

示意图

  • 源码地址

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

 

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

再去看也可以。

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

 

转载地址:https://credream.blog.csdn.net/article/details/118072359 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C++基础部分_C++文件操作_二进制文件的写操作---C++语言工作笔记078
下一篇:AndroidStudio_安卓原生开发_全局异常处理_并记录系统错误日志---Android原生开发工作笔记138

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月14日 09时16分04秒