一、MVP
简称:MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。(from 百度)
MVP模式_百度百科:https://baike.baidu.com/item/MVP%E6%A8%A1%E5%BC%8F/10961746?fr=aladdin
MVC造成的问题:①View 层和 Controller 层没有分离,逻辑混乱;②View 和 Controller 层的耦合,导致 Activity 或者 Fragment 臃肿,代码量很大。因此为了解决以上问题,我们使用MVP模式
当 View 需要更新数据时,通过 Presenter 去找 Model 请求数据,Model 获取到数据后通知 Presenter,Presenter 再通知 View 更新数据,使得 Model 和 View 不会直接交互,所有的交互都由 Presenter 进行,Presenter 充当了桥梁的角色。很显然,Presenter 必须同时持有 View 和 Model 的对象的引用,才能在它们之间进行通信。
参考文章:https://blog.csdn.net/singwhatiwanna/article/details/80841705
二、Okhttp3
参考文章:https://www.jianshu.com/p/9f2c982cd500
Square公司的一款开源的网络请求库
工作流程:通过OkHttpClient将构建的Request转换为Call,然后在RealCall中进行异步或同步任务,最后通过一些的拦截器interceptor发出网络请求和得到返回的response。
依赖库:
//网络请求okhttp3
compile'com.squareup.okhttp3:okhttp:3.9.1'
//日志的拦截器
compile'com.squareup.okhttp3:logging-interceptor:3.6.0'
三、Retrofit2
Square公司开发的一款针对Android 网络请求的框架(底层默认是基于OkHttp 实现)。
依赖库
//Retrofit2库
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
//gson解析
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0
四、Rxjava2
一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库),RxJava使异步操作变得非常简单。
//rxjava2库
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
基本了解了几个开源框架后,我们进入实战,看到我的项目结构:
第一步:新建mode类
创建数据的model类
Retrofit2基于Gson解析,尽量把数据中的每个字段都描述到,model类增加构造方法、getter/setter方法、toString方法。
第二步:初始化Retrofit
新建RetrofitHelper.java。用于初始化Retrofit,设置请求API的baseUrl、gson解析方式
新建RetrofitService.java。管理Retrofit的各种数据请求(post、get),包含请求api、请求参数。
注意:post请求中必须增加注解@FormUrlEncoded,否则会报异常。
第三步:View的接口类
public interface AppVersionView extends View{
void onSuccess(AppVersionModel appVersion);
void onError(String error);
}
第四步:Presenter的接口类
/**
* Created by wuhuihui on 2019/5/17.
* Presenter:基类方法用于Activity或Fragment在onDestory解绑View
* 所有presenter的基类,子类实现其方法,
*/
public interface Presenter {
void onCreate();
void onStart();
void onDestory();
void pause();
void attachView(View view);
void attachIncomingIntent(Intent intent);
}
对于请求的实现Presenter类
class AppVersionPresenter implements Presenter
@Override
public void onCreate() {
manager = new DataManager(context);
compositeDisposable = new CompositeDisposable();
//RxJava1: mCompositeSubscription = new CompositeSubscription();
}
@Override
public void onDestory() {
if (compositeDisposable != null && !compositeDisposable.isDisposed()) {
compositeDisposable.dispose(); //解除订阅
compositeDisposable.clear(); //取消所有订阅
compositeDisposable = null;
//RxJava1:CompositeSubscription.unsubscribe();
}
}
网络请求封装
public void getAppVersion(String currentVersion, String type) {
Observable<AppVersionModel> observable = manager.getAppVersion(currentVersion, type);
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<AppVersionModel>() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
}
@Override
public void onNext(AppVersionModel value) {
appVersion = value;
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
Log.i(TAG, "onError:" + e.toString());
appVersionView.onError("请求失败:\n" + e.toString());
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete!");
if (appVersionView != null) {
appVersionView.onSuccess(appVersion);
Log.i(TAG, "appVersion:" + appVersion.toString());
}
}
});
}
第五步:DataManager:数据处理管理器,用于处理多个API Observable
/**
* Created by wuhuihui on 2019/5/17.
* DataManager:数据处理管理器,用于处理多个API Observable
*/
public class DataManager {
private RetrofitService retrofitService;
public DataManager(Context context) {
this.retrofitService = RetrofitHelper.getInstance(context).getServer();
}
public Observable<AppVersionModel> getAppVersion(String currentVersion, String type) {
return retrofitService.getAppVersion(currentVersion, type);
}
}
第六步:网络请求实现并显示数据 MainActivity.java
MainActivity的布局中放两个控件, Button requestData点击按钮实现网络请求,TextView showData用来显示数据。
private AppVersionPresenter appVersionPresenter = new AppVersionPresenter(this);
appVersionPresenter.getAppVersion("6.0", "android"); //开始请求数据
appVersionPresenter.onCreate(); //启动Presenter,订阅View
//刷新UI,显示数据
appVersionPresenter.attachView(new AppVersionView() {
@Override
public void onSuccess(AppVersionModel appVersion) {
showData.setText(appVersion.getLatestVersion()
+ "\n" + appVersion.getSize()
+ "\n" + appVersion.getUrl()
+ "\n\n新版本更新内容:\n"
);
List<String> list = appVersion.getFunctions();
for (int i = 0; i < list.size(); i++) {
showData.append(list.get(i) + "\n");
}
}
@Override
public void onError(String error) {
showData.setText(error);
}
});
//当activity onDestroy时取消对View的引用
@Override
protected void onDestroy() {
super.onDestroy();
appVersionPresenter.onDestory(); //取消view的引用,避免内存泄漏
}
运行结果:
大概的代码实现已经讲完,基本的框架思路已经成型。
最后附上gitHub地址:https://github.com/wuhuihui2016/InitMVP.git。
应该庆幸有这么一段待业期,让我重新认识自己,重新审视自己的傲娇,至少能够认识到自己的不足并及时补救,就为时未晚。任重而道远,加油,还有更多技术、框架值得去深究,保持学习的心态,学到老活到老。学习不是浅尝辄止,每一次都应该用心实现,善始善终。
每天进步一点点,技术分享还在更新。。。
路过的大神们,希望对你们有帮助,同时如果有更好的见解和意见,请多多评论指正,也期待得到您的喜欢与支持~~~ (190517)
上一篇:Android XMPP实现即时通讯:https://www.jianshu.com/p/f0cef68eb9ac
下一篇:OKHttp LoggingInterceptor的使用:https://www.jianshu.com/p/53a9125d610d
我的更多学习分享:https://www.jianshu.com/u/57ab9a74e2c0