IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android框架解析 - EventBus中的反射 -> 正文阅读

[移动开发]Android框架解析 - EventBus中的反射

作者:token keyword

Android框架解析 - EventBus中的反射

EventBus完成消息的转递,实现过程中使用了大量的反射,我们一起看看反射是怎么使用的

1、使用反射动态创建对象和调用方法

1.1、步骤

1、获取类的Class对象,三种方式

  1. 通过类名.class获得

    Class c1 = User.class;
    
  2. 通过对象获得

    User user = new User();
    Class c1 = user.getClass();
    
  3. forName获得

    Class c1 = Class.forName("类的全限定名");
    

2、通过Class对象无参构造实例化一个对象

3、通过Class对象获取指定方法

4、执行方法,调用Method的invoke方法,参数是(执行方法的对象,执行方法所需的参数值)

1.2、代码

package com.wei.reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * @Class:Test11
 * @Description:测试通过反射调用方法
 * @author:jiawei.hao
 * @Date:2022/5/29
 */
public class Test11 {

    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
        //通过反射获取类的Class对象
        Class c1 = Animal.class;
        //通过Animal无参构造实例化一个对象
        Animal animal = (Animal) c1.newInstance();

        //获取指定方法
        Method setName = c1.getDeclaredMethod("setName", String.class);
        //获取setName方法的修饰符
        //获取修饰符对应的int值,如1:public;2:private;4:protected;8:static;16:final;32:synchronized;64:volatile;128:transient;256:native;512:interface;1024:abstract;2048:strict
        System.out.println(setName.getModifiers()); //1
        //获取修饰符的名称,如public,private
        System.out.println(Modifier.toString(setName.getModifiers())); //public
        //invoke:调用的意思
        //invoke(对象,方法的值)
        setName.invoke(animal,"猫咪");
        System.out.println(animal); //Animal{name='猫咪'}
    }

}

class Animal{

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Animal(String name) {
        this.name = name;
    }

    public Animal() {
    }

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                '}';
    }
}

2、Event的执行流程

2.1、register方法

register方法的参数是Activity或者Fragment,以Activity为例。通过反射遍历所有Activity中所有的方法,筛选出以onEvent开头并方法,封装成new SubscriberMethod(method, threadMode, eventType)对象,多个对象存在list,也就是subscriberMethods对象中

遍历subscriberMethods,按照eventType(也就是自定义的Event类,作为参数传入onEventXX方法中)进行分组,每个eventType对应一个subscriptions对象-由new Subscription(Activity,method,priority)组成的List。

2.2、post方法

1、post方法的参数是一个eventType,根据这个eventType,找到对应的subscriptions对象,然后根据对象中的Activity和method就可以直接invoke调用,代码如下:

//subscription.subscriberMethod.method,Activity中的onEvent方法,subscription.subscriber代表Activity,event就是自定义Event类,是onEvent方法中的参数
subscription.subscriberMethod.method.invoke(subscription.subscriber, event);

2、考虑threadMode的情况下:

PostThread:在post方法调用的线程进行invoke

MainThread:首先去判断当前如果是UI线程,则直接调用;否则: mainThreadPoster.enqueue(subscription, event);把当前的方法加入到队列,然后直接通过handler去发送一个消息,在handler的handleMessage中,去执行我们的方法。说白了就是通过Handler去发送消息,然后执行的

BackgroundThread:如果当前非UI线程,则直接调用;如果是UI线程,则将任务加入到后台的一个队列,最终由Eventbus中的一个线程池去调用

executorService = Executors.newCachedThreadPool();

Async:将任务加入到后台的一个队列,最终由Eventbus中的一个线程池去调用;线程池与BackgroundThread用的是同一个

这么说BackgroundThread和Async有什么区别呢?

3、BackgroundThread中的任务,一个接着一个去调用,中间使用了一个布尔型变量handlerActive进行的控制。

Async则会动态控制并发。

2.3、相关博客

Android EventBus源码解析 带你深入理解EventBus

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:22:00  更:2022-06-01 15:22:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 1:01:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码