自己搭建的一个便捷的软件架构
在根项目build.gradle的allprojects --> repositories 中添加: maven { url "https://jitpack.io" }
在项目的build.gradle的dependencies中添加:implementation 'com.github.CaostGrace:graceLibrary:1.1.3'
支持Mvp模式,其中Activity和Fragment为P层,Activity需继承ActivityDelegate,Fragment继承FragmentDelegate,V层及M层分别继承BaseModel及BaseView 其中v层Activity和Fragment通用,用法如下:
public class TestActivity extends ActivityDelegate<TestView, TestModel> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_mvp);
mModel.addDisposable(TestModel.mHttpManager
.createApi(TestApi.class)
.defaultTest("", "成都天气")
.compose(RxSchedulers.<Bean>defaultCompose())
.subscribeWith(new DefaultObserver<Bean>(mView) {
@Override
public void onHandleSuccess(Bean bean) {
ToastUtil.init(TestActivity.this)
.makeText(bean.toString(), Toast.LENGTH_SHORT).show();
}
})
);
}
@Override
public Class<?> getViewClass() {
return TestView.class;
}
@Override
public Class<?> getModelClass() {
return TestModel.class;
}
}
public class TestView extends BaseView {
DialogManager manager;
LoadDialog mDialog;
@BindView(R.id.frame_layout)
public FrameLayout mFrameLayout;
@Override
public void showLoadingView(String str) {
LogUtils.d(mContext.getCacheDir().getAbsolutePath());
mDialog = LoadDialog.create(mContext)
.setTitleText("加载中...");
mDialog.show();
}
@Override
public void showErrorView(String str) {
Alerter.create((Activity) mContext)
.setDuration(2000)
.setTitle("错误信息")
.setText(str)
.show();
}
@Override
public void hideLoadingView() {
if (mDialog != null){
mDialog.cancel();
}
}
@Override
public void hideErrorView() {
}
@Override
public void showErrorMsg(String str) {
manager = new DialogManager
.Builder()
.setFragmentManager(mFragmentManager)
.create()
.setTitle("注意,这是一个错误信息", DialogManager.HighMode.HIGH)
.setMessage(str)
.build();
manager.show();
}
@Override
public void initView() {
}
@OnClick({R.id.test01,R.id.test02})
public void onClick(View view){
switch (view.getId()){
case R.id.test01:
showErrorMsg("加载中...");
break;
case R.id.test02:
TestFragment fragment = new TestFragment();
mFragmentManager.beginTransaction().add(R.id.frame_layout,fragment)
.commit();
break;
}
}
}
public class TestModel extends BaseModel {
}
public class TestFragment extends FragmentDelegate<FragmentView,TestModel> {
@Override
public int getLayoutId() {
return R.layout.fragment_mvp;
}
@Override
public void init() {
LogUtils.d("init");
}
@Override
public Class<?> getViewClass() {
return FragmentView.class;
}
@Override
public Class<?> getModelClass() {
return TestModel.class;
}
}
public class FragmentView extends BaseView {
@Override
public void initView() {
}
@OnClick({R.id.test01})
public void onClick(View view){
switch (view.getId()){
case R.id.test01:
ToastUtil.init(mContext).makeSuccessToast("成功", Toast.LENGTH_SHORT).show();
break;
}
}
@Override
public void showLoadingView(String str) {
}
@Override
public void showErrorView(String str) {
}
@Override
public void hideLoadingView() {
}
@Override
public void hideErrorView() {
}
@Override
public void showErrorMsg(String str) {
}
}
如果要使用自带的mvp模式,项目的Application需要继承依赖的ApplicationLibrary重写getBaseUrl方法或者重写BaseModel的getHttpBaseUrl方法 Activity和Fragment均可封装为BaseActivity和BaseFragment 只当子类有自己的需求时在重写具体的两个返回Model层和View层类对象的的方法。
Class<?> getModelClass();
Class<?> getViewClass();
public class BaseActivity extends ActivityDelegate<BaseView,BaseModel> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_base);
}
@Override
public void setContentView(int layoutResID) {
mView.setContentView(layoutResID);
}
@Override
public Class<?> getViewClass() {
return BaseView.class;
}
@Override
public Class<?> getModelClass() {
return BaseModel.class;
}
}
public class BaseModel extends cn.logcode.library.mvp.BaseModel {
@Override
public String getHttpBaseUrl() {
return AppConfig.BASE_URL;
}
}
public class BaseView extends cn.logcode.library.mvp.BaseView {
protected RelativeLayout toolbar;
protected FrameLayout container;
protected View content;
//占位View 可用于设置加载View或者错误View
protected FrameLayout seat_view;
@Override
public void initView() {
toolbar = get(R.id.toolbar);
container = get(R.id.container);
seat_view = get(R.id.seat_view);
}
public void setContentView(@LayoutRes int layoutResID) {
content = View.inflate(mContext,layoutResID,null);
container.addView(content,0);
}
@Override
public void showLoadingView(String s) {
}
@Override
public void showErrorView(String s) {
}
@Override
public void hideLoadingView() {
}
@Override
public void hideErrorView() {
}
@Override
public void showErrorMsg(String s) {
}
//显示占位View
public void showSeatView(){
container.setVisibility(View.GONE);
seat_view.setVisibility(View.VISIBLE);
}
//隐藏占位View
public void hideSeatView(){
seat_view.setVisibility(View.GONE);
container.setVisibility(View.VISIBLE);
}
}
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
App.mHandler.postDelayed(() ->{
mView.showSeatView();
},2000);
App.mHandler.postDelayed(() ->{
mView.hideSeatView();
},10000);
}
@Override
public Class<?> getViewClass() {
return MainView.class;
}
}
public class MainView extends BaseView {
@Override
public void initView() {
super.initView();
App.mHandler.postDelayed(() ->{
ToastUtil.init(mContext)
.makeErrorToast("网络错误啦", Toast.LENGTH_SHORT)
.show();
},2000);
App.mHandler.postDelayed(() ->{
ToastUtil.init(mContext)
.makeSuccessToast("网络正常啦", Toast.LENGTH_SHORT)
.show();
},10000);
}
}
具体例子见app的中例子代码,框架提供的MVP模式,提供了HttpManager实例,可直接用此实例进行网络请求,重写的getHttpBaseUrl方法就是Http地址