来来来,我们一起踩坑,一起写BUG
最近看了这个,然后也试着搞了一下,发下有点不想看以前的项目了....
传送:demo-GitHub
MVP这个定义我就不说了,网上很多,可以直接看官网的,需要的请到这里集结--->传送门MVP之GitHub
1、包结构
base --->主要放的是基类
contacts --->常数
contract --->管理MVP对应层的接口
listener --->接口
model --->逻层
presenter --->业务层
retrofit --->关于retrofit的
tool --->工具
ui --->关于界面的
view--->presenter 和ui通讯的接口
weight--->自定义view
2、引用RxJava+Retrofit2.0
1、gradle:
//RxJava+RxAndroid+RxAndroid
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-jackson:2.0.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
2、接口管理
RetrofitService类
public interface RetrofitService {
@FormUrlEncoded //表单上传
@POST("jsonTest.action")
Observable<String> getMainData(@FieldMap Map<String, String> map);//map形式可以让我们用个类封装要传的参数,便于管理
}
3、Retrofit 整理类
RetrofitManager类
public class RetrofitManager {
private volatile static RetrofitManager retrofitManager;
private Retrofit retrofit;
//无参的单利模式
public static RetrofitManager getSingleton() {
if (retrofitManager == null) {
synchronized (RetrofitManager.class) {
retrofitManager = new RetrofitManager();
}
}
return retrofitManager;
}
//无参的构造方法
private RetrofitManager() {
initRetrofitManager();
}
//构造方法创建Retrofit实例
private void initRetrofitManager() {
retrofit = new Retrofit.Builder().baseUrl(Constacts.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
//构造方法创建Retrofit实例
private RetrofitManager buildRetrofit() {
retrofit = new Retrofit.Builder().baseUrl(Constacts.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
return retrofitManager;
}
private OkHttpClient getClient() {
CommonInterceptor commonInterceptor = new CommonInterceptor();
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(commonInterceptor)
.build();
return client;
}
public RetrofitService RetrofitService() {
return retrofit.create(RetrofitService.class);
}
}
4、其他
<p>这个就是几个核心了,剩下的什么错误管理呀,之类的就请自己看写的demo吧 </p>
3、MVP层详解
model主要是处理数据
1、model 逻辑层
这个层的类只负责拿到数据 不用去管数据是做什么,只管拿到对应的就好了
MainModel 类
public class MainModel implements MainContract.Model {
@Override
public void getMainData(Map<String, String> map, Presenter.RxObserver observer) {
RetrofitManager
.getSingleton()
.RetrofitService()
.getMainData(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}
2、presenter 业务层
这个是连接model和view的中间层,他不涉及界面操作 通过接口提醒view层刷新就行
1.基类
public abstract class Presenter<V> {
public V view;//这个是通知view刷新的接口可以没有
private IHttp http;//这个是网络请求需要的接口(都一样,直接这样写了)
void Presenter(){
}
/**
* 加载View 建立连接
*/
public void addView(V v, IHttp http) {
this.view = v;
this.http = http;
}
/**
* 断开连接
*/
public void detattch() {
if (view != null) {
view = null;
}
}
/**
*
* @param <Object>
*/
public class RxObserver<Object> implements Observer<Object> {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object object) {
http.onSuccess(object);
}
@Override
public void onError(Throwable e) {
http.onFail(e);
}
@Override
public void onComplete() {
http.onCompleted();
}
}
}
2.对应界面的presenter
MainPresenter 类
public class MainPresenter extends Presenter<IMainView> implements MainContract.Presenter {
private MainModel mainModel;
void MainPresenter() {
mainModel = new MainModel();
}
@Override
public void getMainData(Map<String, String> map) {
mainModel.getMainData(map,new RxObserver());
}
}
3、View 界面
1.基类
这里只贴activity的fragment自己去demo看了
public abstract class MVPActivity<p extends Presenter> extends AppCompatActivity implements IMVPView , IHttp {
private Unbinder unbinder;
public p presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initBefor();
setContentView(initLayout());
unbinder = ButterKnife.bind(this);
initView();
initData();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (unbinder != null) {//解绑
unbinder.unbind();
}
presenter.detattch();
}
public abstract void initView();
public abstract void initData();
public abstract int initLayout();
protected abstract p initPresener();
@Override
public void initBefor() {
presenter = initPresener();
presenter.addView(this,this);
}
@Override
public void onSuccess(Object object) { }
@Override
public void onFail(Object t) { }
@Override
public void onCompleted() { }
}
2.view层 MainActivity类
public class MainActivity extends MVPActivity<MainPresenter> {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void initView() {
}
@Override
public void initData() {
presenter.getMainData(Tool.toMap(new MainInfo()));
}
@Override
public int initLayout() {
return 0;
}
@Override
protected MainPresenter initPresener() {
return new MainPresenter();
}
@Override
public void onSuccess(Object object) {
super.onSuccess(object);
//请求成功
}
//失败呀,完成呀自己看IHttp这个接口吧
}
3.View层的接口:
public interface IMVPView {
/**
* 在加载界面之前
*/
void initBefor();
/**
* 初始化UI
*/
void initView();
/**
* 加载数据
*/
void initData();
/**
* 加载布局
* @return 布局id
*/
int initLayout();
}
4、大结局
总体写的不怎么 希望能帮助大家,最后再来次传送:demo-GitHub
不经经常写,感觉写这么多,才感觉人家写的辛苦,所以以后给那些大神点个攒,哈哈 顺便给我这个小白点鼓励呗哈哈
网友评论