前言
最近在新项目中看了很多MVP框架,然后自己搭建了MVP框架,所以在这里总结一下,拿出来希望大家能相互学习一下。
一、基本架构
MVP的构成简单介绍一下,全称:Model-View-Presenter;它是从经典的模式MVC演变而来,它们的基本思想有相通的地方:
Controller/Presenter负责逻辑的处理
Model提供数据
View负责显示
首先把目录让大家看一下。有一个基本的了解。
1、Base系列
base系列都是为了能轻松的写好公共代码部分。
BasePresenter
public interface BasePresenter {
void subscribe();
void unSubscribe();
}
这两个方法就是为了能控制Presenter中的对象的生命周期而定义的。这也是MVP框架的一个优化。
BaseView
public interface BaseView<T> {
}
另外两个就不展示了,大体都一样。
二、MainActivity的搭建
1、MainContart
interface MainContract {
interface View extends BaseView<Presenter> {
void onError(String s);
void onSuccess(BookBean bookBean);
}
interface Presenter extends BasePresenter {
void getData(String search);
}
}
这个类的存在就是为了能统一管理View和Presenter的方法,要新增方法直接在这里写上然后去对应页面alt+Enter就可以了。
这里View的泛型T设置为下面的这个Presenter接口。
二、MainPresenter
然后再弄这个Presenter
class MainPresenter implements MainContract.Presenter {
private MainContract.View view;
MainPresenter(MainContract.View view) {
this.view = view;
}
@Override
public void subscribe() {
}
@Override
public void unSubscribe() {
}
@Override
public void getData(String search) {
}
}
这里是在构造器中绑定View层。
然后再贴一份已经写好内容的Presenter类
class MainPresenter implements MainContract.Presenter {
private MainContract.View view;
private CompositeDisposable compositeDisposable;
MainPresenter(MainContract.View view) {
this.view = view;
compositeDisposable = new CompositeDisposable();
}
@Override
public void subscribe() {
}
@Override
public void unSubscribe() {
compositeDisposable.clear();
}
@Override
public void getData(String search) {
RetrofitManager.getInstance().getServer().searchBook("小王子")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BookBean>() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
}
@Override
public void onNext(BookBean value) {
view.onSuccess(value);
}
@Override
public void onError(Throwable e) {
view.onError(e.toString());
}
@Override
public void onComplete() {
}
});
}
}
三、MainActivity
最后再在activity界面继承View接口
public class MainActivity extends AppCompatActivity implements MainContract.View {
@BindView(R.id.activity_text)
TextView textView;
private MainContract.Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
presenter = new MainPresenter(this);
presenter.getData("数据");
}
@Override
protected void onResume() {
super.onResume();
presenter.subscribe();
}
@Override
protected void onPause() {
super.onPause();
presenter.unSubscribe();
}
@Override
public void onError(String s) {
Log.e("error", s);
}
@Override
public void onSuccess(BookBean bookBean) {
textView.setText(bookBean.toString());
}
}
在onCreate中初始化MainPresenter类。
四、Retrofit+Rxjava2
RetrofitManager管理工具类:
public class RetrofitManager {
private Retrofit retrofit;
private RetrofitManager() {
init();
}
private void init() {
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder();
//请求体定制:统一添加token参数
if (original.body() instanceof FormBody) {
FormBody.Builder newFormBody = new FormBody.Builder();
requestBuilder.method(original.method(), newFormBody.build());
}
Request request = requestBuilder.build();
return chain.proceed(request);
}
}).build();
retrofit = new Retrofit.Builder()
.baseUrl(SERVER_HOST)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.callFactory(client)
.build();
}
public ApiService getServer() {
return retrofit.create(ApiService.class);
}
public static RetrofitManager getInstance() {
return RetrofitManagerHolder.INSTANCE;
}
private static class RetrofitManagerHolder {
private static final RetrofitManager INSTANCE = new RetrofitManager();
}
}
ApiService接口类:
public interface ApiService {
@GET("v2/book/search")
Observable<BookBean> searchBook(@Query("tag") String tag);
}
这两个的使用方法的学习就各自去搜索学习资料吧,还是很丰富的。
总结
这里就是我在项目中使用的基本MVP框架,在实际使用中感觉还可以,之前一直在用MVC没有接触MVP,但真正用上了MVP感觉还是不难的,只要跨出了第一步,剩下的都OK。
如果对我的这个框架有什么的意见的话,欢迎大家能在评论中指出,不胜感激~