Android | AsyncTask基础梳理

AsyncTask详解
本文深入解析AsyncTask的工作原理,包括其目的、实现方式及如何避免应用无响应(ANR)。介绍了AsyncTask的生命周期方法,如onPreExecute、doInBackground、onPostExecute和onProgressUpdate,以及如何正确使用它们来执行后台任务和更新UI。
  • AsyncTask. 异步任务

    • 目的:方便后台线程中操作后更新UI
      封装并简化了异步操作

    • 实现:ThreadHandler进行了封装

    • 实质:Handler异步消息处理机制

    • 参数是泛型:<Params,Progress,Result>

    • UI操作:onPreExecuteonPostExecute

    • 后台线程操作 doInBackground

    • 输入输出:Params(入),Result(出)

    • 进度显示:onProgressUpdate


  • ANR(Application Not Responding)

    • 应用程序无响应,
      原因:UI线程被耗时任务(网络请求、下载上传、加载图片等)阻塞,界面卡死;
      所以,
      注意适当开启异步任务、子线程;
      处理耗时操作,防止UI线程出现ANR现象
  • UI线程做主线程,
    子线程做工作线程;

  • 如果在子线程更新UI更新主线程的东西,
    app会闪退,崩溃,
    保证线程安全;
    子线程可以通过以下几个方法,
    切换到主线程更新:

    • Activity.runOnUiThread(Runnable)
    • View.post(Runnable)
    • View.postDelayed(Runnable,long)




AsyncTask解析

  • 查看AsyncTask源码:
    可以在项目的任意位置,Ctrl+N,打开输入框,输入想要查看的类名,
    点击搜索到的类名,即可前往查看源码:

    9125154-a043164dcb69d4e3.png

  • 可以看到首先AsyncTask它是个抽象类,
    参数都是泛型:

    9125154-82059535fbf408cd.png





使用
  • 使用时首先需要新建一个类,继承AsyncTask
    泛型要填包装类,或者自定义的Model类型
    系统要求至少一定要继承doInBackground()这个方法,
    即在后台子线程进行的一个方法,
    doInBackground()参数类型
    即泛型的第一个参数类型,即入参Params参数类型
    return 返回的是结果,即泛型的第三个参数:
public class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> {

        @Override
        protected Boolean doInBackground(String... strings) {
            return null;
        }
    }
  • String...中的三个点,
    表示该参数的长度是可变的;

  • 写完定义类之后,
    在主线程new一下即可,
    使用execute(),传入可变长度的入参,
    即可启动AsyncTask

public class MainActivity extends AppCompatActivity {

    //logt 然后回车,快速生成!!!!!!!!
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new DownloadAsyncTask().execute("哈喽", "早上好");
    }

    public class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> {

        /**
         * 方法执行在异步任务之前,执行在主线程中!!
         * 方法体中,可以 ;‘’;操作UI !!
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Boolean doInBackground(String... params) {

            // fori 回车 快速生成!!!!!!!!!!!
            for (int i = 0; i < 10000; i++) {
                Log.i(TAG, "doInBackground " + i +
                        ": " + params[0] + "," + params[1]);
            }
            return true;
        }
    }
}

运行:
9125154-a83d9472b0fe16a7.png





  • 各方法作用概述,如代码中注释:

public class MainActivity extends AppCompatActivity {

    //logt 然后回车,快速生成!!!!!!!!
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new DownloadAsyncTask().execute("哈喽", "早上好");
    }

    public class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> {

        /**
         * 方法执行在异步任务之前,执行在主线程中!!
         * 方法体中,可以 ;‘’;操作UI !!
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        /**
         * 本方法运行在子线程中,
         * 处理工作内容、耗时操作
         *
         * @param params
         * @return
         */
        @Override
        protected Boolean doInBackground(String... params) {

            // fori 回车 快速生成!!!!!!!!!!!
            for (int i = 0; i < 10000; i++) {
                Log.i(TAG, "doInBackground " + i +
                        ": " + params[0] + "," + params[1]);

                publishProgress(i);//抛出进度
            }
            return true;
        }

        /**
         * 本方法运行在主线程中,可以处理结果
         *
         * 当任务执行完了,会把上一个doInBackground()的参数传递过来
         * @param aBoolean
         */
        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
        }

        /**
         * 本方法运行在主线程
         * 进度变化就在这个方法处理
         * 接收来自 doInBackground()中 publishProgress()抛出的进度,
         * 并处理
         *
         * @param values 类型是定义时的第二个泛型参数,
         *               数据来自 doInBackground()的 publishProgress()
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
        }
    }
}

补充
  • onCancelled()

    • 运行在:主线程
      调用时刻:当异步任务被取消时被调用
      作用:可用于做界面取消的更新
  • 注意:
    不要直接调用onPreExecute()、doInBackground()、onProgressUpdate()、onPostExecute)和onCancelled()方法
    AsyncTask对象必须在主线程创建;

  • 开始和结束异步任务的方法:
    execute(Params...params)
    必须在主线程中调用
    作用:表示开始一个异步任务
    注意:一个异步对象只能调用一次execute()方法

  • cancel(booleanmayInterruptIfRunning)
    必须在主线程中调用
    作用:表示停止一个异步任务

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌川江雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值