MVP简介
相信大家对MVC都是比较熟悉了:M-Model-模型、V-View-视图、C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。 从MVC和MVP两者结合来看,Controlller/Presenter在MVC/MVP中都起着逻辑控制处理的角色,起着控制各业务流程的作用。而 MVP与MVC最不同的一点是M与V是不直接关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层,其负责调控 View与Model之间的间接交互,MVP的结构图如下所示,对于这个图理解即可而不必限于其中的条条框框,毕竟在不同的场景下多少会有些出入的。在 Android中很重要的一点就是对UI的操作基本上需要异步进行也就是在MainThread中才能操作UI,所以对View与Model的切断分离是 合理的。此外Presenter与View、Model的交互使用接口定义交互操作可以进一步达到松耦合也可以通过接口更加方便地进行单元测试。
RxJava和RxAndroid(https://github.com/ReactiveX/RxAndroid)越来越流行,通过线程调度器很容易控制和切换线程,。但是使用的时候很容易导致内存泄露。
Rxlifecycle
Rxlifecycle (https://github.com/trello/RxLifecycle)就是被用来解决由于发布了一个订阅后而没有及时取消Activity/Fragment无法销毁导致的内存泄露。核心思想是通过监听Activity、Fragment的生命周期,来自动断开subscription以防止内存泄漏。
Retrofit
Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求,其源码详见OkHttp Github。
一、需要用到的依赖
//rxpermission->6.0动态权限申请框架
implementation 'com.tbruyelle.rxpermissions2:rxpermissions:+'
//http依赖
api 'com.squareup.okhttp3:okhttp:3.11.0'
//http日志拦截器
api 'com.squareup.okhttp3:logging-interceptor:3.11.0'
//gson
api 'com.google.code.gson:gson:2.8.5'
//rxjava
api 'io.reactivex.rxjava2:rxjava:2.2.3'
//rxandroid
api 'io.reactivex.rxjava2:rxandroid:2.1.0'
//retrofit网络请求框架
api 'com.squareup.retrofit2:retrofit:2.4.0'
//retrofit下gson插件->网络请求回数据自动使用gson解析
api 'com.squareup.retrofit2:converter-gson:2.4.0'
//retrofit下使用rxjava线程调度插件
api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
二、分包方式
主要分三个包,有其他需要可也自己添加入utils…
M-Model-模型、V-View-视图、P-Presenter-表示器
三、RxJava+Retrofit进行网络下载
1.接口
@GET("ios/cf/{path}")
Observable<Foodentity> getData(@Path("path") String path, @Query("stage_id") String stage_id,@Query("limit") String limit,@Query("page") String page);
2.工具栏获取一个Retrofit 要单例
public class RetrofitManager {
private static RetrofitManager retrofitManager;
private Retrofit retrofit;
private RetrofitManager() {
}
public static RetrofitManager getInstance(){
if (retrofitManager == null){
synchronized (String.class){
if (retrofitManager == null){
retrofitManager = new RetrofitManager();
}
}
}
return retrofitManager;
}
//获取Retrofit的对象
public Retrofit getRetrofit(){
if (retrofit == null){
CreateRetrofit();
}
return retrofit;
}
private void CreateRetrofit() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder ok = new OkHttpClient.Builder();
ok.connectTimeout(1, TimeUnit.MINUTES)
.readTimeout(1,TimeUnit.MINUTES)
.addInterceptor(interceptor)
.build();
Retrofit.Builder builder = new Retrofit.Builder();
builder.baseUrl("http://www.qubaobei.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(ok.build());
retrofit = builder.build();
}
}
3.Model曾进行网络请求
public class FoodModel {
private IModel iModel;
public FoodModel(IModel iModel) {
this.iModel = iModel;
}
public void StartDwonLoad(){
RetrofitManager.getInstance().getRetrofit()
.create(FoodApi.class)
.getData("dish_list.php","1","20","1")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Foodentity>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Foodentity foodentity) {
iModel.onSuccess(foodentity);
}
@Override
public void onError(Throwable e) {
iModel.onDefeated(e.getMessage());
}
@Override
public void onComplete() {
}
});
}
}
4.Presenter进行交互
public class BesePresenter implements IModel {
private FoodModel foodModel = new FoodModel(this);
private IView iView;
public BesePresenter(IView iView) {
this.iView = iView;
}
public void StartDwonLoad(){
foodModel.StartDwonLoad();
}
@Override
public void onSuccess(Foodentity foodentity) {
iView.onSuccess(foodentity);
}
@Override
public void onDefeated(String message) {
iView.onDefeated(message);
}
}
5.实体类进行数据返回
public class MainActivity extends AppCompatActivity implements IView {
private BesePresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter = new BesePresenter(this);
presenter.StartDwonLoad();
//注册广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
registerReceiver(myBroadcastReceiver,intentFilter);
}
@Override
public void onSuccess(Foodentity foodentity) {
Toast.makeText(this, foodentity.getData().toString(), Toast.LENGTH_SHORT).show();
}
@Override
public void onDefeated(String message) {
}
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if(networkInfo!=null && networkInfo.isAvailable()){
Toast.makeText(context, "当前网络可用", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "当前网络不可用", Toast.LENGTH_SHORT).show();
}
}
}
}