MVP+Rxlifecycle和Retrofit+网络判断

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();
            }

        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MX_XXS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值