=========================================================================
对方法进行拆解封装重构的例子:
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();
例如,点击登录按钮执行登录这个过程,是点击事件导致了登录请求的执行。
再例如,点击桌面图标启动某个App这个过程,是点击事件导致了某个Activity的创建。
再例如,应用收到一个透传的推送消息而弹出某个提示这个过程,是网络消息事件导致程序的执行。
于是得到命题一,命题一:事件是程序执行的动机。
事件是程序执行的动机,意味着程序的方法栈的栈底是一个事件方法。
例如,执行登录网络请求时,程序的方法栈是:
onClick() > requestLogin() > HttpUtil.login();
其中onClick()就是登录按钮的OnClickListener监听器的事件方法。
对onClick()方法进行拆解封装重构之后,requestLogin()就消除了,执行登录网络请求的方法栈变为:
onClick() > HttpUtil.login();
于是得到结论A,结论A:对事件方法进行拆解封装重构之后,程序调用各个子模块的方法都是事件方法。
对于程序,为了让每个子模块内部都不调用其他子模块(包括Android的Activity),那必然需要构建一个“中间模块”来创建和调用各个子模块。
又由5.2节中的“结论A:程序调用各个子模块的方法都是事件方法”,那么只要把事件方法都迁移到“中间模块”,就可以让程序只存在“中间模块”调用子模块。于是程序满足了性质一“事件动机模式中只存在‘中间模块’调用子模块”。
至于怎样把事件方法迁移到“中间模块”,只要将监听器的设置放在“中间模块”即可。例如将mActivity.setLoginListener()
、mGpsManager.setLocationListener()
放在“中间模块”中调用。
如果子模块的某个监听器只调用子模块本身,那么这个监听器只需要在子模块内部创建,不需要放在“中间模块”中。
命题二:任何一个本体都具有内部结构与外部关系,一内一外构成其整体。
本体的内部结构与外部关系:
子模块的内部结构就是子模块内部的变量和方法等。由于只有“中间模块”的方法中调用了多个子模块,所以子模块的外部关系就是“中间模块”,于是将“中间模块”命名为外部关系模块。
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)]