浅谈组件化封装思想

我以前怎么写项目?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initToolBar()....
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
@Override
public void run(){
HttpUrlConnection...
InpustSream is= connection.getInputStream...
File image = is...
msg.obj = bitmap...
handler.sendMsg...
}.start();
}
}
});
}

谈组件化封装思想,首先看我以前怎么写代码。这是其中一个具体的activity,先初始化ToolBar,再给按钮设置监听事件,点击后开启线程进行Http请求,请求后获取输入流,保存到文件,再发送到主线程,设置imageview的图片。如果另一个activity也要进行下载图片,我就需要把代码再复制一次,如果出现bug或有新业务需求,就需要再改每一个activity,不得不说,耦合性很严重。

现在?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class HomeFragment extends BaseActivity {
@Override
public Integer setLayoutID() {
return R.layout.fragment_launcher;
}
@Override
public void initToolBar() {
super.initToolBar();
{
toolbar.setText("首页");
}
}
@OnClick(R.id.bt_download)
public void onClickDownload(){
HttpClient.builder()
.url("xxxxxx.jpg")
.loader(getContext(),null)
.file(getExternalCacheDir().getAbsolutePath()+"/img/",hello.jpg")
.success(mSuccess)
.failure(mFailure)
.error(mError)
.build()
.get();
}
}

将一些常用的空间封装在BaseActivity,可以重写方法对其进行差异化更新,下载封装为一个HttpClient类,包含加载动画,文件路径,成功失败的回调接口。现在比以前好一点,出现bug可以修改BaseActivity或者封装好的库就可以了。

更好的选择


如果要修建一所大学的新校区,设计师先设计学校整体的规划,哪里是图书馆、哪里是教学区、哪里是试验楼…,设计好总体架构后,应该为每栋楼进行设计,然后开始建造每栋楼,一栋楼建好就可以测试是否可以使用,如果不行,就可以单独修复,最后修好校园道路,就结束了。


我们开发APP也应有这种思想:
1.创建Lib,将工具类、网络、文件等类在其中
2.创建Lib,将公共资源、drawable、String等放在其中
3.将APP分成多个模块,如登陆注册模块、商品详情模块、提交商品模块,每个模块要添加并引用1、2创建好的lib
4.逐一开发某个模块,build时可以作为app进行测试,非build仅作为lib,见下方gradle中脚本
5.将所有组件引入到工程的app中

1
2
3
4
5
if (IsBuildMudle.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}