Android 中AsyncTask后台线程,异步任务的理解

简介: Android 中AsyncTask后台线程,异步任务的理解

前言:

简单介绍:

AsyncTask是标准Java线程的一个包装类,它封装了最常见的模式:在子线程中执行后台工作,然后与UI线程同步以发送进度和最终结果。AsyncTask允许以串行或并行的方式或者通过自己的线程池执行后台的任务。

AsyncTask类实现了将耗时的操作移到了后台线程中,然后与UI线程同步以报告更新,并在处理完成后再次同步UI线程的最佳实践模式。

AsyncTask类指定了三个泛型参数,AsyncTask<Params, Progress, Result>

  1. Params,在执行AsyncTask时需要传入的参数,可用于在后台任务中使用。
    对应doInBackground(Params)方法中的参数类型。 该方法中的返回值,则会作为参数传递到onPostExcute(Result)方法中
  2. Progress。后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。
    对应onProgressUpdate(Progress)方法中的参数类型
  3. Result。当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。
    对应onPostExecute(Result)方法中的参数类型

注意:使用AsyncTask,创建异步任务,需要拓展AsyncTask类并指定要使用的参数类型

意思:就是继承AsyncTask类,并重写里面的方法。

public class QueryAsyncTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... strings) {
        return null;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
    }
}

方法的作用如下:

  1. doInBackground():该处理程序将在后台线程中执行,因此可以将长时间的代码放在此处,并且不要尝试在该处理程序中与UI对象进行交互,它接收一组参数,类型在类的实现中定义,在该处理程序被调用之前,将会先调用onPreExecute处理程序。在此处理程序中可以使用publishProgress方法将参数传入onProgressUpdate处理程序。后台任务完成后会返回最终结果,结果将作为参数传入onPostExecute处理程序中,可以再此处相应地更新UI。
  2. onPreExecute():重写该处理程序,在doInBackground运行前更新UI
    如:显示加载进度条。该处理程序在执行时将会同步到UI线程,因此可以安全的修改UI元素
  3. onProgressUpdate():重写该处理程序,使用间歇式的进度更新来更新UI,该处理程序可以接收到传递给publishProgress的参数集(通常来自doInBackground处理程序)。该处理程序在执行后将会同步到UI线程,因此可以安全的修改UI元素。
  4. onPostExecute():当doInBackground处理程序完成后,返回值将会传递给onPostExecute事件处理程序。此处理程序在执行后将与UI线程完成同步,因此可以在异步任务完成后使用该处理程序安全地更新任何UI组件。

下面我们通过在AsyncTask类中更新进度条的进度,来加深理解这个AsyncTask的用法。

首先设置布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".AsyncTaskDemoActivity">
    <ProgressBar
        android:id="@+id/progress_bar"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:max="100" />
    <Button
        android:id="@+id/btn_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="开启进度条" />
</LinearLayout>

之后是Activity的代码:

public class AsyncTaskDemoActivity extends AppCompatActivity implements View.OnClickListener {
    private ProgressBar progress_bar;
    private Button btn_start;
    private static final String TAG = "AsyncTaskDemoActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_async_task_demo);
        progress_bar = findViewById(R.id.progress_bar);
        btn_start = findViewById(R.id.btn_start);
        btn_start.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        AsyncTaskTest asyncTaskTest = new AsyncTaskTest();
        //启动异步线程 execute()传进来的参数,就是doInBackground需要的这个参数
        asyncTaskTest.execute(1000);
    }
    class AsyncTaskTest extends AsyncTask<Integer, Integer, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.e(TAG, "onPreExecute: ");
        }
        @Override
        protected String doInBackground(Integer... integers) {
            Log.e(TAG, "doInBackground: ");
            for (int i = 0; i <= 10; i++) {
                //设置发布进度的方法,会自动调用onProgressUpdate()来执行
                //会把这个方法的参数值传给onProgressUpdate()方法中
                publishProgress(i * 10);
                try {
                    Thread.sleep(integers[0]);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "执行完毕";
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            Log.e(TAG, "onProgressUpdate: ");
            progress_bar.setProgress(values[0]);
            super.onProgressUpdate(values);
        }
        @Override
        protected void onPostExecute(String s) {
            Log.e(TAG, "onPostExecute: " + s);
            super.onPostExecute(s);
        }
    }
}

具体注释已经在代码中给出了。

效果图如下:

我们再通过后台日志,可以清楚的看到AsyncTask中的方法的执行顺序。

AsyncTask执行过程分析图


目录
相关文章
|
1月前
|
Java 调度 Android开发
构建高效Android应用:探究Kotlin多线程编程
【2月更文挑战第17天】 在现代移动开发领域,性能优化一直是开发者关注的焦点。特别是在Android平台上,合理利用多线程技术可以显著提升应用程序的响应性和用户体验。本文将深入探讨使用Kotlin进行Android多线程编程的策略与实践,旨在为开发者提供系统化的解决方案和性能提升技巧。我们将从基础概念入手,逐步介绍高级特性,并通过实际案例分析如何有效利用Kotlin协程、线程池以及异步任务处理机制来构建一个更加高效的Android应用。
|
1月前
|
Java 数据库 Android开发
Android异步之旅:探索AsyncTask
Android异步之旅:探索AsyncTask
23 0
|
1月前
|
API 数据库 Android开发
构建高效Android应用:探究Kotlin多线程优化策略
【2月更文挑战第14天】随着移动设备性能的日益强大,用户对应用程序的响应速度和流畅性要求越来越高。在Android开发中,合理利用多线程技术是提升应用性能的关键手段之一。Kotlin作为一种现代的编程语言,其协程特性为开发者提供了更为简洁高效的多线程处理方式。本文将深入探讨使用Kotlin进行Android多线程编程的最佳实践,包括协程的基本概念、优势以及在实际项目中的应用场景和性能优化技巧,旨在帮助开发者构建更加高效稳定的Android应用。
|
1月前
|
数据采集 存储 Java
「多线程大杀器」Python并发编程利器:ThreadPoolExecutor,让你一次性轻松开启多个线程,秒杀大量任务!
「多线程大杀器」Python并发编程利器:ThreadPoolExecutor,让你一次性轻松开启多个线程,秒杀大量任务!
|
1月前
|
Python
Python学习之路 02 之分支结构
Python学习之路 02 之分支结构
47 0
Python学习之路 02 之分支结构
|
1月前
|
Java Python 开发者
Python 学习之路 01基础入门---【Python安装,Python程序基本组成】
线程池详解与异步任务编排使用案例-xian-cheng-chi-xiang-jie-yu-yi-bu-ren-wu-bian-pai-shi-yong-an-li
78 2
Python 学习之路 01基础入门---【Python安装,Python程序基本组成】
|
1月前
|
存储 算法 Java
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
74 0
|
12天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
11 0
|
14天前
|
Java API 调度
安卓多线程和并发处理:提高应用效率
【4月更文挑战第13天】本文探讨了安卓应用中多线程和并发处理的优化方法,包括使用Thread、AsyncTask、Loader、IntentService、JobScheduler、WorkManager以及线程池。此外,还介绍了RxJava和Kotlin协程作为异步编程工具。理解并恰当运用这些技术能提升应用效率,避免UI卡顿,确保良好用户体验。随着安卓技术发展,更高级的异步处理工具将助力开发者构建高性能应用。
|
22天前
|
Java Spring
定时任务里面的任务多线程操作
该内容是关于Spring Boot中配置异步任务和定时任务的代码示例。首先通过`@Configuration`和`@EnableAsync`开启异步支持,然后定义线程池,如使用`ThreadPoolExecutor`并设置核心线程数、最大线程数等参数。接着,在需要异步执行的方法上添加`@Async`注解。此外,通过`@EnableScheduling`开启定时任务,并使用`@Scheduled`定义具体任务和执行周期。若需指定多个线程池,可以创建不同的`Executor` bean,并在`@Async`中指定线程池名称。
19 2