概述
因为写了很多小app,业务逻辑并不是很复杂,涉及到的技术也不多,所以一直都想弄一个轻巧点的框架,只需要请求网络,拿到网络数据即可。于是就有了下边这篇文章,不喜勿喷,个人记录。
背景: 现在比较流行的框架当然是MVP,网上有很多demo,我觉得讲的比较好,扩展性高,耦合性低就有一个MVPArms这个框架不仅仅讲了mvp模式,还有比如加载图片怎样降低耦合等,在我们写不出比作者更优秀的框架之前,我们都应该去模仿,去仔细思考为何要这么写。
这只是第一版,有一些不足
(1) 说网络请求都要写在ApiService这个类里面,因为在BasePresenter里面创建的retrofit service就只是ApiService。
(2) 网络请求应该和P层进行隔离,这样后续就算有复杂的业务逻辑,P类可读性就不会那么低。
效果图如下
首先看BaseActivity
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements IBaseView {
protected P mPresenter;
private LoadingDialog mDialog;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentResId());
ButterKnife.bind(this);
mDialog = new LoadingDialog(this);
mPresenter = initPresenter();
}
public abstract int getContentResId();
protected abstract P initPresenter();
@Override
protected void onDestroy() {
super.onDestroy();
if (mPresenter != null) {
mPresenter.destroy();
}
}
@Override
public void showProgress() {
if (mDialog != null && !mDialog.isShowing()) {
mDialog.show();
}
}
@Override
public void hideProgress() {
if (mDialog != null && mDialog.isShowing()) {
mDialog.cancel();
}
}
}
BasePresenter
public class BasePresenter<V extends IBaseView, B> implements HttpCallBack<B> {
protected V iView;
private CompositeDisposable mCompositeDisposable;
protected ApiService mApiService;
protected BasePresenter(V view) {
this.iView = view;
mApiService = RetrofitManager.getInstance().getRetrofit().create(ApiService.class);
}
public <B> void requestHttp(String tag, Flowable<BaseBean<B>> flowable) {
initCompositeDisposable();
showProgress();
FlowableCallBack<B> flowableCallBack = flowable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribeWith(new FlowableCallBack<B>(tag, this));
mCompositeDisposable.add(flowableCallBack);
}
@Override
public void onSuccess(String tag, BaseBean<B> o) {
}
@Override
public void onFinish(String tag) {
if (iView != null)
iView.hideProgress();
}
@Override
public void onFailed(String tag, Throwable throwable) {
}
private void showProgress() {
if (iView != null) {
iView.showProgress();
}
}
private void initCompositeDisposable() {
if (mCompositeDisposable == null) {
mCompositeDisposable = new CompositeDisposable();
}
}
public void destroy() {
unDispose();
detachView();
}
private void detachView() {
if (iView != null) {
iView.hideProgress();
iView = null;
}
}
private void unDispose() {
if (mCompositeDisposable != null) {
mCompositeDisposable.clear();
}
mCompositeDisposable = null;
}
}
IBaseView类
public interface IBaseView {
void showProgress();
void hideProgress();
}
核心类都贴出来了,我们看看在实例中如何使用
IMainView类,这是当网络请求成功的时候,需要回调到Activity页面
public interface IMainView extends IBaseView {
void loadInfoBeanSuccess(InfoBean infoBean);
void loadWeacherBeanSuccess(WeacherBean weacherBean);
}
MainPresenter类,进行网络请求,并且拿到请求结果
public class MainPresenter extends BasePresenter<IMainView, BaseBean> {
public static final String TAG = "MainPresenter";
public MainPresenter(IMainView view) {
super(view);
}
public void getInfoBeans() {
requestHttp("getInfoBeans", mApiService.getInfo("yule", "d687fc2c061e23ca2abae9d653eb089a"));
}
public void getWeacherBeans() {
requestHttp("getWeacherBeans", mApiService.getWeacherInfo("北京", "08e039171e23350af52ed943ce8aaed7"));
}
@Override
public void onSuccess(String tag, BaseBean o) {
super.onSuccess(tag, o);
if ("getInfoBeans".equals(tag)) {
InfoBean infoBean = (InfoBean) o.getResult();
Log.e(TAG, "返回结果是" + infoBean);
iView.loadInfoBeanSuccess(infoBean);
} else if ("getWeacherBeans".equals(tag)) {
WeacherBean weacherBean = (WeacherBean) o.getResult();
Log.e(TAG, "返回结果是" + weacherBean);
iView.loadWeacherBeanSuccess(weacherBean);
}
}
@Override
public void onFailed(String tag, Throwable throwable) {
super.onFailed(tag, throwable);
}
}
MainActivity类,发出请求
public class MainActivity extends BaseActivity<MainPresenter> implements IMainView {
@BindView(R.id.id_tv_content)
TextView id_tv_content;
@Override
public int getContentResId() {
return R.layout.activity_main;
}
@Override
protected MainPresenter initPresenter() {
return new MainPresenter(this);
}
@OnClick({R.id.id_btn_request_yule, R.id.id_btn_request_weacher})
public void click(View view) {
int id = view.getId();
switch (id) {
case R.id.id_btn_request_yule:
mPresenter.getInfoBeans();
break;
case R.id.id_btn_request_weacher:
mPresenter.getWeacherBeans();
break;
}
}
@Override
public void loadInfoBeanSuccess(InfoBean infoBean) {
if (infoBean == null) {
return;
}
StringBuilder sb = new StringBuilder();
List<InfoBean.ThumbnailBean> data = infoBean.getData();
for (InfoBean.ThumbnailBean bean : data) {
sb.append(bean.getAuthor_name()).append("\n");
}
id_tv_content.setText(sb.toString());
}
@Override
public void loadWeacherBeanSuccess(WeacherBean weacherBean) {
if (weacherBean == null) {
return;
}
WeacherBean.Today today = weacherBean.getToday();
StringBuilder sb = new StringBuilder();
sb.append(today.getCity()).append(today.getWind()).append(today.getDressing_advice());
id_tv_content.setText(sb.toString());
}
}
全部代码在github上,欢迎start和提问题
github