MVP+Rxjava2.0+Retrofit2.0现在是非常火的组合
MVP相信大家已经在各大网站和各大佬的文章中已经了解很多理论的理解了
MVP其实就是M层请求数据 在P层里进行M层和V层的交互 V层得到数据后展示数据
比如说豺狼妈妈去捕食 捕到食物后回到在窝里把食物喂给狼宝宝
豺狼妈妈就是M P就是狼窝 V就是狼宝宝
MVP的重点就是接口回调 不熟悉不了解接口回调的话最好先去学习练习接口回调

那么实战项目中MVP+Rxjava2.0+Retrofit2.0有两个重要的类

Cantranct:mvp这三个接口的总类 都放在这个类里 清晰和规范
APIInterface:API接口的总类 Retrofit请求的接口全放在这个里面
项目整体的分包情况如下:

下面我是用MVP+Rxjava2.0+Retrofit2.0+RecyclerView详细的介绍一下
接口:http://api.kkmh.com/v1/daily/comic_lists/0?since=0&gender=0

下面代码的注释!非常详细的标注了每个接口!每个接口里方法!的作用

网络权限:

 <uses-permission android:name="android.permission.INTERNET" />

依赖:

 //Retrofit的依赖compile 'com.squareup.retrofit2:retrofit:2.3.0'compile 'com.squareup.okhttp3:okhttp:3.9.0'compile 'com.squareup.retrofit2:converter-gson:2.3.0'compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'//RxJava2的依赖compile 'io.reactivex.rxjava2:rxjava:+'compile 'io.reactivex.rxjava2:rxandroid:+'compile 'com.squareup.okhttp3:logging-interceptor:3.9.0'//glide依赖compile 'com.github.bumptech.glide:glide:3.7.0'//RecyclerView依赖compile 'com.android.support:recyclerview-v7:26.1.0'

创建api包 创建APIInterface接口

import com.example.mydemo.bean.MyBean;import io.reactivex.Observable;
import retrofit2.http.GET;/*** Created by wxy on 2017/12/6.* API 所有的请求都写在此类*/public interface APIInterface {//接口地址//String url = "http://api.kkmh.com/v1/daily/comic_lists/0?since=0&gender=0";//get请求@GET("v1/daily/comic_lists/0?since=0&gender=0")Observable<MyBean> getMyData();  //泛型里的为Bean类
}

创建cantranct包 创建Cantranct类

mport com.example.mydemo.bean.MyBean;import java.util.List;/*** Created by wxy on 2017/12/6.* mvp接口的总类*/public class Cantranct {//M层接口及方法: 获取数据public interface IModel {//M层获取请求数据的方法 方法参数为下面的接口对象void model(CallBack callBack);//M层获取到数据之后 存入这个接口的方法然后把数据回调给P层interface CallBack {//方法的参数保存m层获取到的数据 然后回调给P层void callData(List<MyBean.DataBean.ComicsBean> comics);}}//P层接口及方法:M和V层的交互等逻辑(其实P层写不写接口都可以 用接口显得统一规范)public interface IPresenter {void presenter();}//V层接口 :接收数据 显示数据public interface IView {//方法的参数用于接收在P层里通过M层获取到的数据void view(List<MyBean.DataBean.ComicsBean> comics);}}

创建model包 创建Model类

import com.example.mydemo.api.APIInterface;
import com.example.mydemo.bean.MyBean;
import com.example.mydemo.cantranct.Cantranct;
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;import java.util.List;import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;/*** Created by wxy on 2017/12/6.* M层 请求数据 然后将数据回调给P层*/public class Model implements Cantranct.IModel {private String baseUrl = "http://api.kkmh.com/";@Override        //这个callback接口就是用来保存数据 在P层里把数据给V层的接口public void model(final CallBack callBack) {Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl)//添加baseurl//添加Rxjava.addCallAdapterFactory(RxJava2CallAdapterFactory.create()).addConverterFactory(GsonConverterFactory.create()).build();//创建添加API类APIInterface apiInterface = retrofit.create(APIInterface.class);//调用API中的getMyData请求方法apiInterface.getMyData()//指定被观察者线程.subscribeOn(Schedulers.io())//指定观察者线程.observeOn(AndroidSchedulers.mainThread())//订阅.subscribe(new Observer<MyBean>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(MyBean myBean) {if (myBean != null) {List<MyBean.DataBean.ComicsBean> data = myBean.getData().getComics();myBean.getData().getComics();//请求到数据后 将数据保存到callback接口的方法里                //用于将数据回调给P层 在P层里将数据给VcallBack.callData(data);}}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});}}

创建presenter包 创建Presenter类

import com.example.mydemo.bean.MyBean;
import com.example.mydemo.cantranct.Cantranct;
import com.example.mydemo.model.Model;import java.util.List;/*** Created by wxy on 2017/12/6.* P层 用于M、V的交互的逻辑 主要将M获取到的数据 给V*/public class Presenter implements Cantranct.IPresenter {//创建M层对象private Model model;//创建V层接口的对象private Cantranct.IView iView;//构造方法的参数为V层的接口对象public Presenter(Cantranct.IView iView) {//待会展示数据的类实现V接口 创建P层的时候 将本身传进来 也就是说P层和展示数据的类他俩使用的是共同的一个V层接口 自然这个V层接口方法里的数据就可以共用了this.iView = iView;//创建M层的时候自然运行M层实现的请求数据方法 现在可以理解为已经请求到了数据model = new Model();}@Override//在这个方法里进行M层和V层的交互public void presenter() {//M层创建保存数据的callback接口对象 这个接口里方法的参数就是数据集合model.model(new Cantranct.IModel.CallBack() {@Overridepublic void callData(List<MyBean.DataBean.ComicsBean> data) {//然后再用V层接口对象保存数据 在V层里展示出来iView.view(data);}});}
}

创建View包 创建Activity类

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;import com.example.mydemo.Adapter.MyAdapter;
import com.example.mydemo.R;
import com.example.mydemo.bean.MyBean;
import com.example.mydemo.cantranct.Cantranct;
import com.example.mydemo.presenter.Presenter;import java.util.List;/*** V层 从P层得到数据后展示数据* 实现V层接口*/
public class MainActivity extends AppCompatActivity implements Cantranct.IView {private RecyclerView recy;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取控件initView();//创建P层对象 传入本身 因为P层的构造函数是IView接口 而本类实现了IView接口 将本身传进去之后 在P层进行交互的V接口获取到数据 在本类实现的V层接口方法里的数据就可以用了Presenter presenter = new Presenter(this);presenter.presenter();}@Override//从P层获取到的数据  在P层里获取到M层请求的数据public void view(List<MyBean.DataBean.ComicsBean> data) {MyAdapter adapter = new MyAdapter(this, data);recy.setAdapter(adapter);recy.setLayoutManager(new LinearLayoutManager(this));}private void initView() {recy = (RecyclerView) findViewById(R.id.recy);}
}

以上就是整个MVP+Rxjava+Retrofit的实战结合 练习完或看完代码之后 再结合你们所看到过的理论好好捋一捋 或找个笔和纸画一画 就能理解的更深点了 下面是RecyclerView的适配器类 和布局文件 想练习这个Demo的可以把下面的复制上去

Bean类就不复制上来了 自己创建吧
activity_main

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.mydemo.view.MainActivity"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recy"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView></RelativeLayout>

item

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="10dp"><ImageView
        android:id="@+id/im"android:layout_width="200dp"android:layout_height="150dp"android:scaleType="fitXY"android:src="@mipmap/ic_launcher" /><TextView
        android:id="@+id/tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:paddingLeft="15dp"android:text="aaaaaa"/>
</LinearLayout>

MyAdapater

import android.content.Context;
import android.media.Image;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;import com.bumptech.glide.Glide;
import com.example.mydemo.R;
import com.example.mydemo.bean.MyBean;import java.util.List;/*** Created by wxy on 2017/12/6.*/public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHodel> {private Context context;private List<MyBean.DataBean.ComicsBean> data = null;public MyAdapter(Context context, List<MyBean.DataBean.ComicsBean> data) {this.context = context;this.data = data;}@Overridepublic MyViewHodel onCreateViewHolder(ViewGroup parent, int viewType) {View view = View.inflate(context, R.layout.item, null);return new MyViewHodel(view);}@Overridepublic void onBindViewHolder(MyViewHodel holder, int position) {Glide.with(context).load(data.get(position).getCover_image_url()).into(holder.im);holder.tv.setText(data.get(position).getTopic().getDescription());}@Overridepublic int getItemCount() {return data.size() != 0 ? data.size() : 0;}static class MyViewHodel extends RecyclerView.ViewHolder {public final ImageView im;public final TextView tv;public MyViewHodel(View itemView) {super(itemView);im = itemView.findViewById(R.id.im);tv = itemView.findViewById(R.id.tv);}}}

最终效果如下

不要看那么多理论 要练 就算自己独自摸索练 慢慢也就理清楚了
下面是Rxjava和Retrofit的链接
Retrofir2.0的简单使用
Rxjava
Rxjava2.0和Retrofit2.0结合使用

Android:这是一份非常详细的MVP+Rxjava2.0+Retrofit2.0相结合举例RecyclerView的实战篇章相关推荐

  1. Carson带你学Android:请收好这一份全面详细的Android学习指南

    前言 如果你也学习Android,那么你大概率会看过我的文章.经常有读者给我留言:"该怎么学习Android?"."日常学习Android的方法是什么". 今天 ...

  2. Carson带你学Android:这是一份全面详细的属性动画学习攻略!

    前言 属性动画的使用 是 Android 开发中常用的知识 本文将献上一份全面 & 详细的属性动画学习指南,将详细介绍属性动画的所有内容,包括:意义.作用.应用场景.功原理 & 具体使 ...

  3. 面试汇总:这是一份全面详细的Android面试指南

    核心面试内容 对于Android技术专业面试,主要考察的内容包括:(已按优先级排序) 通用编程基础 计算机基础 特定编程语言 智力题 需要特别注意的是: 编程基础.计算机基础是 所有技术开发都必备的基 ...

  4. Carson带你学Android:这是一份全面详细的WebView学习攻略

    前言 现在很多App里都内置了Web网页(Hybrid App),比如说很多电商平台,淘宝.京东.聚划算等等,如下图 那么这种该如何实现呢?其实这是Android里一个叫WebView组件实现 今天, ...

  5. Carson带你学Android:这是一份全面详细的动画学习指南

    前言 动画的使用 是 Android 开发中常用的知识 可是动画的种类繁多.使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份Android动画的全面 ...

  6. 这是一份全面详细的Android 车载系统开发入门指南

    目前的就业形势越来越严峻,很多大中小厂因为业务停滞不前都选择"精简人员",节约成本.对于Android开发来说,市场的冷静,明显可以感知到企业招聘门槛的提高.就未来发展来说,选择一 ...

  7. Android环境变量的设置(详细图解版)

    Android环境变量的设置(详细图解版) 转载于:https://www.cnblogs.com/zhujiabin/p/4875182.html

  8. Android底层隐私数据,Android Intent传递数据底层分析详细介绍_Android_脚本之家

    Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...

  9. 给你一份超详细 Spring Boot 知识清单

    转载自   给你一份超详细 Spring Boot 知识清单 在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架.或许从命名上就能看出这个框架的设计初衷:快速的启动Spri ...

最新文章

  1. 大数据调度平台Airflow(八):Airflow分布式集群搭建及测试
  2. python自己做电子词典_python实现电子词典
  3. python笔记:fancyimpute
  4. Vue.js 计算属性和侦听器
  5. oracle 设置查询条数,SQL、MySQL、Oracle、 Sqlite、Informix数据库查询指定条数数据的方法...
  6. 前端学习(1847)vue之电商管理系统电商系统的功能划分
  7. Kubernetes如何赋能可再生能源产业提升10倍效率
  8. code css怎么拿不到div_哈登和威少再怎么努力,也追不上杜兰特,因为刷子是拿不到冠军的...
  9. 关于ubuntu下无线网卡经常连不上网络的问题
  10. Myeclipse字符集设置
  11. Linux内核启动流程详解
  12. html移动图片广告代码,右下角弹出广告代码 控制div移动 1)div是否
  13. 20+非常棒的Photoshop卡通设计教程
  14. 中兴新支点操作系统_中兴新支点系统预装测试
  15. 五年产品经理的转正述职报告(附PPT下载)
  16. Python英文单词大小写转换及所有首字母大写
  17. POI导出Excel(用户自己选择路径)
  18. redis的hash怎么实现以及 rehash过程是怎样的?和JavaHashMap的rehash有什么区别,与ConcurrentHashMap扩容的策略比较?
  19. linux zip unzip指令使用方法
  20. DataLoad命令集

热门文章

  1. 汽车软件通信中间件SOME/IP简述
  2. win7右键菜单管理_Win7系统电脑不能搜索到蓝牙设备的解决办法
  3. 购买域名之后要怎么用
  4. QT之鼠标事件的全局捕获
  5. 使用yocto为raspberry编译内核
  6. AV终结者病毒全面解读及完整解决方案
  7. 程序员的终极思维方式:系统论
  8. |蚂蚁金服漆远首谈刚完成的AI重大突破及紧缺人才,呼吁国内多点技术性强的大会,少点网红
  9. 李开复自传里的一些话
  10. 尤雨溪亲自回应Vue.js涉及国家安全漏洞问题