原地址:http://blog.csdn.net/dfskhgalshgkajghljgh/article/details/51646250
1. 前言
安卓属于小团队开发,架构的重要性在很多公司其实不是那么的明显,加上现在的开源框架层出不穷,更好的帮助我们上手Android项目的开发。我前两年也在公司主导过项目开发,搭建过不少项目,以前主要的倾向是MVC,导致了activity/fragment过大,而且很多公共功能杂乱在项目中,后期维护起来不方便,最近刚好有时间,重新搭建了一个新的框架。(ps:有建议或者更好想法的可以留言。)
2. 用到的知识点:
UI—-面向对象
数据交互—-MVP模式
数据库——GreenDao
网络图片加载—–picasso
json解析—–gson
http请求—-OKHttp
事件总线—-eventbus
以上知识点不熟悉的,可以先熟悉下基本知识,如果已经了解过,可以直接跳过下面的链接,直接看下文的使用。
MVP模式 讲解地址:http://blog.csdn.net/dfskhgalshgkajghljgh/article/details/51317956
GreenDao 讲解地址:http://blog.csdn.net/dfskhgalshgkajghljgh/article/details/51304390
picasso 讲解地址:http://blog.csdn.net/dfskhgalshgkajghljgh/article/details/51684693
OKHttp 讲解地址:鸿神的博客讲解地址:
http://blog.csdn.net/lmj623565791/article/details/47911083
eventbus 讲解地址:http://blog.csdn.net/dfskhgalshgkajghljgh/article/details/51681705
3. 框架整体结构:
这里写图片描述
4.项目目录结构:
这里写图片描述
bean—————————————————存放Java model对象
biz—————————————————–业务模块,根据不能业务建立子模块
bridge————————————————-底层功能实现跟UI层的衔接层
capabilities——————————————–底层功能具体实现(后期项目迭代到一定程度稳定后会考虑以jar形式导入)
constant———————————————–常量
ui——————————————————界面,根据不同业务建立子模块
util—————————————————–业务层公共方法
view—————————————————自定义view实现
5.具体解析
还是按照大家的习惯思维,从界面—>数据—->网络—–>交互,这样的层次讲解。
1)UI层
UI层其实比较简单,主要就是用到面向对象的封装,BaseActivity为基类,同时BaseActivity实现三个接口,分别为CreateInit, PublishActivityCallBack, PresentationLayerFunc,这三个接口的作用依次是:界面初始化,页面跳转封装,页面交互封装。PresentationLayerFunc的具体实现是在PresentationLayerFuncHelper里面,BaseActivity类会初始化该类,把复杂的功能实现抽象出去,轻量化基类。
这里写图片描述
BaseActivity代码如下所示:
/**
* <基础activity>
*
* @author caoyinfei
* @version [版本号, 2014-3-24]
* @see [相关类/方法]
* @since [V1]
*/
public abstract class BaseActivity extends Activity implements CreateInit, PublishActivityCallBack, PresentationLayerFunc, IMvpView, OnClickListener {
private PresentationLayerFuncHelper presentationLayerFuncHelper;
/**
* 返回按钮
*/
private LinearLayout back;
/**
* 标题,右边字符
*/
protected TextView title, right;
public BasePresenter presenter;
public final String TAG = this.getClass().getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presentationLayerFuncHelper = new PresentationLayerFuncHelper(this);
initViews();
initListeners();
initData();
setHeader();
EBApplication.ebApplication.addActivity(this);
EventBus.getDefault().register(this);
}
@Override
public void setHeader() {
back = (LinearLayout) findViewById(R.id.ll_back);
title = (TextView) findViewById(R.id.tv_title);
right = (TextView) findViewById(R.id.tv_right);
back.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_back:
finish();
break;
}
}
public void onEventMainThread(Event event) {
}
@Override
protected void onResume() {
EBApplication.ebApplication.currentActivityName = this.getClass().getName();
super.onResume();
}
@Override
public void startActivity(Class<?> openClass, Bundle bundle) {
Intent intent = new Intent(this, openClass);
if (null != bundle)
intent.putExtras(bundle);
startActivity(intent);
}
@Override
public void openActivityForResult(Class<?> openClass, int requestCode, Bundle bundle) {
Intent intent = new Intent(this, openClass);
if (null != bundle)
intent.putExtras(bundle);
startActivityForResult(intent, requestCode);
}
@Override
public void setResultOk(Bundle bundle) {
Intent intent = new Intent();
if (bundle != null) ;
intent.putExtras(bundle);
setResult(RESULT_OK, intent);
finish();
}
@Override
public void showToast(String msg) {
presentationLayerFuncHelper.showToast(msg);
}
@Override
public void showProgressDialog() {
presentationLayerFuncHelper.showProgressDialog();
}
@Override
public void hideProgressDialog() {
presentationLayerFuncHelper.hideProgressDialog();
}
@Override
public void showSoftKeyboard(View focusView) {
presentationLayerFuncHelper.showSoftKeyboard(focusView);
}
@Override
public void hideSoftKeyboard() {
presentationLayerFuncHelper.hideSoftKeyboard();
}
@Override
protected void onDestroy() {
EBApplication.ebApplication.deleteActivity(this);
EventBus.getDefault().unregister(this);
if (presenter != null) {
presenter.detachView(this);
}
OkHttpManager httpManager = BridgeFactory.getBridge(Bridges.HTTP);
httpManager.cancelActivityRequest(TAG);
super.onDestroy();
}
}
PresentationLayerFuncHelper代码如下所示:
/**
* <页面基础公共功能实现>
*
* @author caoyinfei
* @version [版本号, 2016/6/6]
* @see [相关类/方法]
* @since [V1]
*/
public class PresentationLayerFuncHelper implements PresentationLayerFunc {
private Context context;
public PresentationLayerFuncHelper(Context context) {
this.context = context;
}
@Override
public void showToast(String msg) {
ToastUtil.makeText(context, msg);
}
@Override
public void showProgressDialog() {
}
@Override
public void hideProgressDialog() {
}
@Override
public void showSoftKeyboard(View focusView) {
}
@Override
public void hideSoftKeyboard() {
}
}
三个接口,分别为CreateInit, PublishActivityCallBack, PresentationLayerFunc代码如下所示:
/**
* <公共方法抽象>
*
* @author caoyinfei
* @version [版本号, 2014-3-24]
* @see [相关类/方法]
* @since [V1]
*/
public interface CreateInit {
/**
* 初始化布局组件
*/
public void initViews();
/**
* 增加按钮点击事件
*/
void initListeners();
/**
* 初始化数据
*/
public void initData();
/**
* 初始化公共头部
*/
public void setHeader();
}
/**
* <页面跳转封装>
*
* @author caoyinfei
* @version [版本号, 2016/6/6]
* @see [相关类/方法]
* @since [V1]
*/
public interface PublishActivityCallBack {
/**
* 打开新界面
*
* @param openClass 新开页面
* @param bundle 参数
*/
public void startActivity(Class