Android事件动机模式,曾经的面试经历 以及对面试的各项准备

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

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

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

}

protected ActivityLifecycleListener newActivityLifecycleListener() {

return new ActivityLifecycleListener(){

};

}

}

五、事件动机模式的原理

5.1 对方法进行拆解封装重构

对方法进行拆解封装重构的例子:

void functionX() {

sentenceA();

functionB();

functionC();

}

private void functionB() {

sentenceD();

functionE();

}

private void functionE() {

sentenceF();

}

private void functionC() {

sentenceG();

sentenceH();

}

对方法functionX()拆解封装重构之后得到:

void functionX() {

sentenceA();

sentenceD();

sentenceF();

sentenceG();

sentenceH();

}

重构之前,functionX()方法调用语句sentenceF()形成的栈是:

functionX() > functionB() > functionE() > sentenceF();

重构之后,functionX()方法调用语句sentenceF()形成的栈是:

functionX() > sentenceF();

5.2 事件是程序执行的动机

例如,点击登录按钮执行登录这个过程,是点击事件导致了登录请求的执行。

再例如,点击桌面图标启动某个App这个过程,是点击事件导致了某个Activity的创建。

再例如,应用收到一个透传的推送消息而弹出某个提示这个过程,是网络消息事件导致程序的执行。

于是得到命题一,命题一:事件是程序执行的动机。

事件是程序执行的动机,意味着程序的方法栈的栈底是一个事件方法。

例如,执行登录网络请求时,程序的方法栈是:

onClick() > requestLogin() > HttpUtil.login();

其中onClick()就是登录按钮的OnClickListener监听器的事件方法。

对onClick()方法进行拆解封装重构之后,requestLogin()就消除了,执行登录网络请求的方法栈变为:

onClick() > HttpUtil.login();

于是得到结论A,结论A:对事件方法进行拆解封装重构之后,程序调用各个子模块的方法都是事件方法。

5.3 子模块的内部结构与外部关系

对于程序,为了让每个子模块内部都不调用其他子模块(包括Android的Activity),那必然需要构建一个“中间模块”来创建和调用各个子模块。

又由5.2节中的“结论A:程序调用各个子模块的方法都是事件方法”,那么只要把事件方法都迁移到“中间模块”,就可以让程序只存在“中间模块”调用子模块。于是程序满足了性质一“事件动机模式中只存在‘中间模块’调用子模块”。

至于怎样把事件方法迁移到“中间模块”,只要将监听器的设置放在“中间模块”即可。例如将mActivity.setLoginListener()、mGpsManager.setLocationListener()放在“中间模块”中调用。

如果子模块的某个监听器只调用子模块本身,那么这个监听器只需要在子模块内部创建,不需要放在“中间模块”中。

命题二:任何一个本体都具有内部结构与外部关系,一内一外构成其整体。

本体的内部结构与外部关系:

子模块的内部结构就是子模块内部的变量和方法等。由于只有“中间模块”的方法中调用了多个子模块,所以子模块的外部关系就是“中间模块”,于是将“中间模块”命名为外部关系模块。

5.4 事件动机模式Android版实现的技巧

Activity模块创建完成之后再创建外部关系模块,并把Activity传入外部关系模块的构造器中。然后在外部关系模块的构造器中优先执行mActivity.setLifecycleListener()。对于ActivityLifecycleListener,由于点击返回按钮会导致onDestroy()执行,所以将onDestroy()视为事件方法,onResume()、onRequestPermissionsResult()等也是这样,于是将这几个事件方法放在ActivityLifecycleListener监听器中。

BaseActivity.java

public abstract class BaseActivity extends Activity {

private ActivityLifecycleListener mLifecycleListener;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(getLayoutResourceID());

onCreateViewModule();

newExternalRelations();

if (mLifecycleListener != null) {

mLifecycleListener.onModulesCreated();

}

}

protected abstract int getLayoutResourceID();

protected abstract void onCreateViewModule();

protected abstract void newExternalRelations();

protected void setLifecycleListener(ActivityLifecycleListener activityLifecycleListener) {

mLifecycleListener = activityLifecycleListener;

}

@Override

protected void onDestroy() {

if (mLifecycleListener != null) {

mLifecycleListener.onDestroy();

}

super.onDestroy();

}

… // onResume(), onPause(), onRequestPermissionsResult()等类似于onDestroy()一样

}

MainActivity.java

@Override

protected void newExternalRelations() {

new MainRelations(this);

}

BaseExternalRelations.java

public class BaseExternalRelations {

protected Activity mActivity;

public BaseExternalRelations(Activity activity) {

mActivity = activity;

mActivity.setLifecycleListener(newActivityLifecycleListener());

}

protected ActivityLifecycleListener newActivityLifecycleListener() {

return new ActivityLifecycleListener(){

};

}

}

MainRelations.java

public MainRelations(MainActivity mainActivity) {

super(mainActivity);

mGpsManager = new GpsManager(mainActivity.getApplicationContext());

mGpsManager.setLocationListener(newLocationListener());

}

@Override

protected ActivityLifecycleListener newActivityLifecycleListener() {

return new ActivityLifecycleListener() {

@Override

public void onModulesCreated() { // 当各个模块都创建完成、设置监听器完成后,所执行的

… // do something

}

@Override

public void onDestroy() {

… // do something

}

};

}

相当于Java桌面程序版这样的流程:

ViewManager mViewManager = new ViewManager();

new XxxExternalRelations(mViewManager);

public XxxExternalRelations(mViewManager) {

mViewManager.setOnVvvListener((vparam) -> {

// 调用mViewManager, mFileManager, HttpUtil, mGpsManager, mGeocoderManager, PureCalculation

});

mFileManager = new FileManager();

mGpsManager = new GpsManager();

mGeocoderManager = new GeocoderManager();

mFileManager.setOnFffListener((fparam) -> {

// 调用mViewManager, mFileManager, HttpUtil, mGpsManager, mGeocoderManager, PureCalculation

});

mGpsManager.setOnGggListener((gparam) -> {

// 调用mViewManager, mFileManager, HttpUtil, mGpsManager, mGeocoderManager, PureCalculation

});

}

对于携带参数数据的情况,参数视为业务数据(业务数据的概念在“5.6 事件动机模式的数据流图”),所以参数数据的变量放在外部关系模块中:

MainRelations.java

public MainRelations(MainActivity mainActivity) {

super(mainActivity);

data = mActivity.getIntent().getData();

mActivity.initViewWithData(data);

}

对于Fragment,类似的方法如下:

XxxRelations.java

public XxxRelations(XxxFragment xxxFragment) {

super(xxxFragment);

data = mFragment.getArguments().getData();

mFragment.initViewWithData(data);

}

5.5 纯计算

数据体:例如Java Bean、字符串、数字、byte数组、Bitmap等称之为数据体。View对象、File对象等不是数据体。

纯计算:以一组数据体作为输入、一组数据体作为输出的函数,称之为纯计算。

[dataD, dataE] = function(dataA, dataB, dataC)

在java语言中,纯计算封装为public static修饰的方法。第3节中的PureCalculation类就是一个纯计算工具类。

纯计算的性质:纯计算函数执行时,数据只在内存和CPU流动,不会涉及显示屏、文件等硬件模块和View、File等软件模块。

5.6 事件动机模式的数据流图

事件动机模式的数据流图:

“业务数据”通过“纯计算”得到“网络模块数据”的举例:

登录时,带有手机号和验证码的Bean对象通过new Gson().toJson(bean)转化为json字符串,json字符串可直接用于网络请求。其中Bean对象是业务数据,new Gson().toJson(bean)是纯计算,json字符串是网络模块数据。

“业务数据”通过“纯计算”得到“视图模块数据”的举例:

题外话

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊

这里我为大家准备了一些我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

欢迎评论区讨论。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

数据”的举例:

题外话

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊

这里我为大家准备了一些我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

[外链图片转存中…(img-F132IoVw-1713707621806)]

欢迎评论区讨论。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-GCRFEolg-1713707621806)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值