程序结构设计理论(Android)
作者:邓能财
2019年9月24日
个人简介
姓名:邓能财
年龄:26
毕业学校:东华理工大学
院系:理学院
专业:信息与计算科学
邮箱:2420987186@qq.com
[明德厚学,爱国荣校]
本文的PPT版、以及作为案例的App项目可以从这里下载:程序结构设计理论(Android)20190924.zip
或者
链接:百度网盘-程序结构设计理论(Android)_20190926.zip
提取码:jmu5
目录
一、android程序中,对界面的访问与更新
二、Activity访问Service,Service更新Activity
三、查找的简化
四、数据体、单纯计算
五、阅读信息量优化
六、功能模块的硬件层与软件层,输入、事件与动机
七、双向绑定与即时更新
八、内部结构与外部关系的架构模式
九、数据与单纯计算所在模块、数据流
十、作为例子的App
一、android程序中,对界面的访问与更新
1.android app的界面是树结构
[如图-app用户界面的树结构]
在android程序中访问界面,即,在树的一个节点访问其他节点。
2.在Activity中某个View访问其他View
HhhViewGroup hhhViewGroup = ((Activity)getContext()).findViewById(R.id.hhh);
或者
ViewGroup rootView = (ViewGroup)((ViewGroup)((Activity)getContext()).findViewById(android.R.id.content)).getChildAt(0);
HhhViewGroup hhhViewGroup = (HhhViewGroup)FindViewUtil.find(rootView, child -> child instanceof HhhViewGroup);
3.在某个Activity中访问其他Activity
BbbActivity bbbActivity = CollectionUtil.find(((App)getApplication()).getActivityList(), item -> item instanceof BbbActivity);
其中(App)getApplication()).getActivityList()需要实现一个Activity列表,可以用ActivityLifecycleCallbacks实现;
4.LllEditText的文本改变时,更新KkkViewGroup的方法
lllEditText.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable text) {
// 处理text
}
});
处理text:
CccActivity cccActivity = ((CccActivity)lllEditText.getContext());
FffFragment fffFragment = (FffFragment)CollectionUtil.find(cccActivity.getFragmentManager().getFragments(), item -> item instanceof FffFragment);
KkkViewGroup kkkViewGroup = (KkkViewGroup)fffFragment.getView().findViewById(R.id.kkk);
或者
KkkViewGroup kkkViewGroup = (KkkViewGroup)FindViewUtil.find(fffFragment.getView(), child -> child instanceof KkkViewGroup);
kkkViewGroup.refresh(text.toString());
5.监听器的设置不外传
由于任何子View或者Fragment都可以访问任何其他节点,因此类似下面的代码是不应该存在的:
假设CccActivity包含FffFragment,FffFragment包含kkkViewGroup;
public class FffFragment {
public void setXxxOnClickListener(XxxOnClickListener xxxOnClickListener) {
kkkViewGroup.setXxxOnClickListener(xxxOnClickListener);
}
}
然后在CccActivity内执行:
fffFragment.setXxxOnClickListener(() -> {CccActivity.this.doThing(); });
应该这样实现:
kkkViewGroup.setXxxOnClickListener(() -> {((CccActivity)kkkViewGroup.getContext()).doThing(); });
二、Activity访问Service,Service更新Activity
1.Activity访问Service
方法一、bindService()
方法二、维护Service列表
在App中定义ArrayList
XxxService xxxService = CollectionUtil.find(((App)getApplication()).getServiceList(), item -> item instanceof XxxService);
2.在Service中更新Activity
BbbActivity bbbActivity = CollectionUtil.find(((App)getApplication()).getActivityList(), item -> item instanceof BbbActivity);
bbbActivity.refresh(data);
三、查找的简化
for(Ttt item : list) {
if (item...) {
doThing(item);
break;
}
}
可简化为:
Ttt item = CollectionUtil.find(list, item...);
doThing(item);
find的实现:
public class CollectionUtil {
public static <T> T find(Collection<T> list, Filter<T> filter) {
for(T object : list) {
if (filter.accept(object)) {
return object;
}
}
return null;
}
public interface Filter<T> {
boolean accept(T obj