Google大佬都用的广播goAsync源码分析

下面就详细讲解一下“Google大佬都用的广播goAsync源码分析”的完整攻略。

什么是广播goAsync

广播goAsync是Android中一种异步广播处理方式,它可以在主线程之外执行广播接收器的代码,避免了主线程阻塞。在Android系统中,广播是一种重要的机制,它可以在应用程序间传递消息。但是,当广播接收器执行耗时操作时,就会阻塞UI线程,影响用户体验,这时就需要使用广播goAsync来异步处理广播。

广播goAsync的使用方法

使用广播goAsync处理广播的步骤如下:

创建广播接收器

首先需要创建一个广播接收器,在其中实现异步处理逻辑。示例代码如下:

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 获取异步广播结果回调对象
        final PendingResult pendingResult = goAsync();
        // 在异步线程中处理广播
        new Thread(new Runnable() {
            @Override
            public void run() {
                //处理广播
                //...
                //异步处理完成后调用finish方法,通知系统已经处理完广播
                pendingResult.finish();
            }
        }).start();
    }
}

注册广播接收器

注册广播接收器的方法有两种,一种是在代码中动态注册,另一种是在AndroidManifest.xml文件中静态注册。

动态注册

动态注册广播接收器的示例代码如下:

//创建广播接收器实例
MyReceiver myReceiver = new MyReceiver();
//创建IntentFilter对象
IntentFilter filter = new IntentFilter();
//添加要监听的广播类型
filter.addAction("com.example.broadcast.MY_BROADCAST");
//注册广播接收器
registerReceiver(myReceiver, filter);

静态注册

在AndroidManifest.xml文件中静态注册广播接收器的示例代码如下:

<receiver android:name=".MyReceiver">
    <intent-filter>
        <action android:name="com.example.broadcast.MY_BROADCAST" />
    </intent-filter>
</receiver>

发送广播

发送广播的方法有两种,一种是发送标准广播,另一种是发送有序广播。

发送标准广播

发送标准广播的示例代码如下:

//创建Intent对象
Intent intent = new Intent();
//设置广播类型
intent.setAction("com.example.broadcast.MY_BROADCAST");
//发送标准广播
sendBroadcast(intent);

发送有序广播

发送有序广播的示例代码如下:

//创建Intent对象
Intent intent = new Intent();
//设置广播类型
intent.setAction("com.example.broadcast.MY_BROADCAST");
//发送有序广播
sendOrderedBroadcast(intent, null);

广播goAsync源码分析

为了更好地了解广播goAsync的实现原理,下面对其源码进行分析。

BroadcastReceiver.goAsync

广播接收器的goAsync方法是广播goAsync实现的核心。源码如下:

public final PendingResult goAsync() {
    if (mPendingResult == null) {
        // 创建PendingResult实例
        mPendingResult = new PendingResult(this, mOrderedHint, mInitialSticky, mDebugUnregister);
    }
    return mPendingResult;
}

BroadcastReceiver.PendingResult

PendingResult是广播goAsync的回调接口,它可以在异步线程中执行广播接收器里的代码。PendingResult的实现源码如下:

public static final class PendingResult {
    // 接收器对象
    private final BroadcastReceiver mReceiver;
    // 广播类型(有序广播或标准广播)
    private final String mType;
    // 是否为有序广播
    private final boolean mOrdered;
    // 是否是初次注册
    private final boolean mInitialSticky;
    // 是否为调试模式
    private final boolean mDebug;
    // resultCode,用于广播结果回传
    private int mResultCode;
    // resultData,用于广播结果回传
    private String mResultData;
    // resultExtras,用于广播结果回传
    private Bundle mResultExtras;
    // 意图
    private final Intent mResultAbort;

    public void setResultCode(int code) {
        mResultCode = code;
    }

    public void setResultData(String data) {
        mResultData = data;
    }

    public void setResultExtras(Bundle extras) {
        mResultExtras = extras;
    }

    public void setResult(int code, String data, Bundle extras) {
        mResultCode = code;
        mResultData = data;
        mResultExtras = extras;
    }

    public void abortBroadcast() {
        if (mOrdered) {
            mResultAbort.setFlags(Intent.FLAG_RECEIVER_ABORTED);
        } else {
            throw new RuntimeException("Abort not supported for asynchronous broadcasts");
        }
    }

    public void finish() {
        if (mDebug) {
            Log.i(TAG, "Finished result " + mResultCode + ", data '" + mResultData + "', extras " + mResultExtras);
        }
        final IActivityManager am = ActivityManagerNative.getDefault();
        if (mOrdered) {
            try {
                am.finishReceiver(mReceiver, mResultCode, mResultData, mResultExtras, mResultAbort, mInitialSticky);
            } catch (RemoteException e) {
                // ...
            }
        } else {
            try {
                am.finishReceiver(mReceiver, mResultData, mResultExtras, mInitialSticky);
            } catch (RemoteException e) {
                // ...
            }
        }
    }
}

总结

以上就是“Google大佬都用的广播goAsync源码分析”的完整攻略。广播goAsync是一种在Android系统中用于异步处理广播的机制。使用广播goAsync需要创建一个广播接收器,并在其中实现异步处理逻辑。同时,我们也可以通过阅读源码,更好地了解广播goAsync的实现原理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Google大佬都用的广播goAsync源码分析 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Docker 部署HAProxy v2.2.29 并暴露指标接口的问题解决

    下面我将详细讲解“Docker 部署HAProxy v2.2.29 并暴露指标接口的问题解决”的完整攻略。 准备工作 首先需要安装Docker,如果已经安装可以跳过这一步。 示例一:在Ubuntu系统上安装Docker # 添加Docker GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/g…

    人工智能概览 2023年5月25日
    00
  • 如何制作一个Node命令行图像识别工具

    制作一个Node命令行图像识别工具的完整攻略: 1. 安装必要的工具 首先,你需要安装以下工具: Node.js:一个基于Chrome V8引擎的JavaScript运行环境 OpenCV:一款用于视觉识别和图像处理的开源计算机视觉库 Tesseract:一个开源的OCR(Optical Character Recognition)引擎 可以采用以下方式安装…

    人工智能概论 2023年5月25日
    00
  • php实现Mongodb自定义方式生成自增ID的方法

    实现自定义方式生成自增ID的方法主要包括以下步骤: 配置Mongodb环境 首先需要安装和配置Mongodb环境,可以参考官方文档进行安装和配置。同时需要安装mongodb的php扩展,可以通过pecl命令进行安装,如下: pecl install mongodb 创建集合和索引 在Mongodb中,需要先创建对应的集合和索引,例如可以创建一个名为“demo…

    人工智能概论 2023年5月25日
    00
  • angular.js+node.js实现下载图片处理详解

    标题: Angular.js+Node.js实现下载图片处理详解 简介 本文将介绍如何使用Angular.js和Node.js实现下载图片的功能,同时演示如何对下载的图片进行处理。本文将分为以下几个部分讲解: 使用Angular.js实现前端页面 使用Node.js实现后端接口 利用Node.js编写图片处理脚本 实现一个完整的示例,演示如何下载并处理图片 …

    人工智能概论 2023年5月25日
    00
  • python3通过selenium爬虫获取到dj商品的实例代码

    下面我将详细讲解“python3通过selenium爬虫获取到dj商品的实例代码”的完整攻略步骤,包括一些常见问题和两条示例说明。 简介 Selenium 是一个自动化测试工具,利用它我们可以驱动浏览器执行特定的动作,模拟人为对浏览器的操作。通过 Python 的 selenium 库更可以方便地实现网页爬虫。在本文中,我将演示如何使用 Python3 和 …

    人工智能概论 2023年5月25日
    00
  • Perl5 OOP学习笔记第2/2页

    首先让我解释一下“Perl5 OOP学习笔记第2/2页”的完整攻略。 这篇攻略旨在帮助初学者掌握Perl5面向对象编程(OOP)的基础知识。第2/2页主要分为两个部分:继承和多态。接下来我将为大家逐一介绍。 继承 继承是OOP中非常重要的概念之一,它可以让我们实现代码的重用性、可维护性和可扩展性。在Perl5中,我们可以使用“@ISA”来定义一个或多个父类。…

    人工智能概论 2023年5月25日
    00
  • Keepalived实现Nginx负载均衡高可用的示例代码

    Keepalived实现Nginx负载均衡高可用的示例代码 什么是Keepalived Keepalived是一款用于实现LVS负载均衡的软件,主要实现了VRRP协议以及Health Check功能。通过使用Keepalived,可以使一组服务器实现负载均衡和高可用性。 Keepalived实现Nginx负载均衡高可用的实现过程 安装Nginx 首先,我们需…

    人工智能概览 2023年5月25日
    00
  • python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

    这里将详细讲解如何使用 Python 中的梯度下降和牛顿法来寻找 Rosenbrock 函数的最小值。先介绍一下 Rosenbrock 函数,它是一个二元函数,公式如下: $$ f(x,y)=(a-x)^2+b(y-x^2)^2$$ 其中 $a=1$,$b=100$。该函数在 $(1,1)$ 处取得最小值 0,但其具有非常强的而且复杂的山峰结构,因此很难找到…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部