互联网寒冬公司倒闭后,Android事件动机模式

5.事件动机模式的原理

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

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()放在“中间模块”中调用。

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

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

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

本体的内部结构与外部关系.png

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

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

总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2020年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包阅读下载,最后觉得有帮助、有需要的朋友可以点个赞

就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2020年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包阅读下载,最后觉得有帮助、有需要的朋友可以点个赞

[外链图片转存中…(img-6JEzEhDC-1720119246086)]

[外链图片转存中…(img-vP3zTEHE-1720119246087)]

[外链图片转存中…(img-HKRORnXH-1720119246087)]

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值