前言
由浅入深,一步一步进阶,这样才能更好的书写漂亮的代码,解耦更强大,阅读Android系统源码更能得心应手。
什么是IOC
IOC中文名称是控制反转的意思,通常是包含抽象的概念,比如一个抽象方法,要由一个具体实现类来完成具体的代码,然后由底层调用,实现数据的多态化,并能大部分实现解耦的目的。
为什么要用IOC
90年代初期的系统架构都是单层的,上层应用调用底层的API来完成相应的功能,随着系统版本的迭代,系统底层的API发生较大的变动,这样上层应用调用逻辑也要做相应的改变,这就造成了很大的维护消耗,大多数系统因此死掉。
后来为了解决这个问题,就产生了IOC的数据处理理论。
常用代码解析
如:线程的使用
线程简单的使用
创建Thread对象,传入一个Runnable对象,IDE会自动补全run方法,这是因为Runnable是一个接口,里面的run方法是抽象的。
Runnable源码
再来看一下Thread的run方法,实际调用的就是Runnable的run方法,调用的代码段就是传入Runnable对象里面实现run方法的代码段。
Thread run方法源码
来看一下UML类图。
流程图
实际开发使用(一种是 定义抽象方法,一种是定义 接口并实现)
比如开发一个BaseActivity,里面有MVP,获取布局id等,可以这么实现。
public abstract class BaseMvpActivity<V, T extends BasePresenter<V>> extends AppCompatActivity{
public BaseMvpActivity mContext;
private Toolbar mToolBarView;
private LinearLayout mView;
private TextView mGoBack;
private TextView mTitle;
private FrameLayout mBaseView;
private FrameLayout mBaseViews;
protected T mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewTools.setActivityBackGroudCoulor(this, Color.parseColor("#ffffff"));
super.setContentView(R.layout.activity_base);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
mContext = this;
mView = (LinearLayout) findViewById(R.id.root_view);
mToolBarView = (Toolbar) findViewById(R.id.tb_app_bar);
mGoBack = (TextView) findViewById(R.id.tv_toolbar_back);
mTitle = (TextView) findViewById(R.id.tv_toolbar_title);
mBaseView = (FrameLayout) findViewById(R.id.base_framelayout);
int viewLayoutId = getViewLayout();
mPresenter = createPresenter();
if (mPresenter != null) {
mPresenter.attachView((V) this);//因为之后所有的子类都要实现对应的View接口
}
if (viewLayoutId != 0) {
View.inflate(mContext, viewLayoutId, mBaseView);
}
setToolBarDetail();
}
这里面有两个重要的方法:getViewLayout()和createPresenter()
//用于创建Presenter和判断是否使用MVP模式(由子类实现)
protected abstract T createPresenter();
//获取布局id
protected abstract int getViewLayout();
下面我们来看下子类的调用:
public class LoginActivity extends BaseMvpActivity<ILoginActivity,LoginPresenter> implements ILoginActivity{
@Override
protected int getViewLayout() {
return R.layout.activity_login_activity;
}
@Override
protected LoginPresenter createPresenter() {
return new LoginPresenter(mContext);
}
这样就实现了多态、代码的复用及解耦。
总结
IOC数据回调的使用有几种形式,今天介绍了两种:一种是方法传入接口,一种是在底层做抽象的方法,以后还会讲解动态设置的一种使用方案。