EventBus源码解析一,安卓面试题及答案2024百度

1.1.1、概述一

1.1.2、概述二

1.2、常见的组件间通信方式

1.3、思考

1.3.1、一种思路:

1.3.2、EventBus的优点

2、使用

2.1、引入依赖:

2.2、使用:

3、自己手写一个EventBus

3.1、GsEventBus.java

3.2、GsSubscribe

3.3、GsSubscribeMethod.java

3.4、GsThreadMode

3.5、EventBusTest4Activity.java

3.6、EventBusTest5Activity.java


0、相关文章:

=======

官网:http://greenrobot.org/eventbus/

EventBus官方教程

视频:https://study.163.com/course/courseLearn.htm?courseId=1209174836#/learn/video?lessonId=1278769701&courseId=1209174836

手写EventBus框架——源码分析1(2017年写的,参照3.0版本)

1、EventBus概述

============

1.1、两种概述


1.1.1、概述一

图一:

1.1.2、概述二

图二:

EventBus除了可以在四大组件之间通信外,还可以在异步线程与主线程之间进行通信。

EventBus流程图(官网):

1.2、常见的组件间通信方式


  1. Intent

  2. Handler

  3. Interface

  4. BroadcastReceiver

  5. AIDL

  6. Messenger

1.3、思考


1.3.1、一种思路:

1.3.2、EventBus的优点

2、使用

====

2.1、引入依赖:


implementation ‘org.greenrobot:eventbus:3.1.1’

2.2、使用:


/**

  • Created by songzi522 on 2019/12/9.

  • 定义事件

*/

public class MyBusEvent {

public final String message;

public MyBusEvent(String message) {

this.message = message;

}

}

public class EventBusTest3Activity extends AppCompatActivity {

@BindView(R.id.btn1)

Button btn1;

@BindView(R.id.btn2)

Button btn2;

@BindView(R.id.btn3)

Button btn3;

@BindView(R.id.btn4)

Button btn4;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_event_bus_test3);

ButterKnife.bind(this);

}

@OnClick({R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4})

public void onViewClicked(View view) {

switch (view.getId()) {

case R.id.btn1:

EventBus.getDefault().postSticky(new MyBusEvent(“Hello Android”));

break;

case R.id.btn2:

break;

case R.id.btn3:

break;

case R.id.btn4:

break;

}

}

// EventBus 的注册与注销最好与Activity和Fragment的生命周期绑定

@Override

protected void onStart() {

super.onStart();

EventBus.getDefault().register(this);

}

@Override

protected void onStop() {

super.onStop();

EventBus.getDefault().unregister(this);

}

// 订阅 事件 准备订阅者

@Subscribe(threadMode = ThreadMode.MAIN)

public void onMessageEvent(MyBusEvent event) {

SmartToast.show(event.message);

}

}

3、自己手写一个EventBus

================

3.1、GsEventBus.java


/**

  • Created by songzi522 on 2019/12/11.

  • 自己手写一个 EventBus

  • 该类可以理解为一个专门负责管理 需要传递的事件 的管理类

  • Activity1(事件发送方)把事件传递给 GsEventBus

  • Activity2(事件接收方)把接受事件传递的方法传给 GsEventBus

  • 所有的事情都由 GsEventBus 来处理,与 Activity1 和 Activity2 无关

  • 因此,第一,GsEventBus 得是一个单例模式

*/

public class GsEventBus {

//定义一个用来装方法的容器

private Map<Object, List> cacheMap;

private static volatile GsEventBus instance;

// 用来切换线程

private Handler mHandler;

private GsEventBus() {

cacheMap = new HashMap<>();

mHandler = new Handler();

}

public static GsEventBus getDefault() {

if (instance == null) {

synchronized (GsEventBus.class) {

if (instance == null) {

instance = new GsEventBus();

}

}

}

return instance;

}

/**

  • 当我们调用 register 方法的时候,就把接收消息的方法放到 cacheMap 中

  • @param object

*/

public void register(Object object) {

List list = cacheMap.get(object);

if (list == null) {

list = findGsSubscribeMethods(object);

cacheMap.put(object, list);

}

}

private List findGsSubscribeMethods(Object object) {

List list = new ArrayList<>();

//获取 activity

Class<?> clazz = object.getClass();

// 除了获取当前activity的有添加注解的方法,它的父类中如果有添加注解的方法,也要放进list

while (clazz != null) {

// 过滤作用:凡是系统级别的父类,直接省略

String name = clazz.getName();

if (name.startsWith(“java.”) || name.startsWith(“javax.”) || name.startsWith(“android.”)) {

break;

}

//获取 activity 中的所有方法

Method[] methods = clazz.getDeclaredMethods();

for (Method method : methods) {

//找到带有 GsSubscribe 的方法

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

尾声

面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。

不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

image

大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《2017-2020字节跳动Android面试历年真题解析》

如果需要PDF版本可以自行领取!

8430)]

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

[外链图片转存中…(img-WoamA2Nf-1710834418430)]

大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-f9VM4JxL-1710834418430)]

《2017-2020字节跳动Android面试历年真题解析》

[外链图片转存中…(img-xN6WO46z-1710834418431)]

如果需要PDF版本可以自行领取!

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值