任务:从网络上获取数据,然后显示在MainActivity的ListView上

一、载入需要用的框架

1、Mvp框架

compile 'com.hannesdorfmann.mosby:mvp:2.0.1'

compile 'com.hannesdorfmann.mosby:viewstate:2.0.1'

2、Retrofit和RxJava框架

compile 'io.reactivex:rxandroid:1.2.0'
compile 'io.reactivex:rxjava:1.1.5'
compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1'

二、设计草图

根据Mvp设计模式:

将提供数据的网络请求,放入model包中。

将显示屏幕数据的类,放入View包中

将处理数据和转换的逻辑,放入Presents包中。

我们这里:只需要实现当获取到数据时候,ListView的显示情况就可以了。

三、开工

1、创建Retrofit的网络请求   Retrofit的使用  放到Model这个包下面

public class ArticleEntity{
//将json数据转换为实体类
private String title;
private String detail; public String getDetail() {
return detail;
} public void setDetail(String detail) {
this.detail = detail;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
}
}

ArticleEntity

public interface DataApi {
//发送数据请求
@GET("refreshlayout/api/newdata{pageNumber}.json")
Observable<List<ArticleEntity>> getArticles(@Path("pageNumber") int pageNumber);
}

DataApi

最后:创建

public class HttpConnection {
//地址:从网上找的
private static final String BASE_URL = "http://7xk9dj.com1.z0.glb.clouddn.com/";
private static HttpConnection mHttConnection;
private Retrofit mRetrofit;
//创建Retrofit
private HttpConnection(){
mRetrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BASE_URL)
.build();
}
//使用单例模式,加上双层锁
public static synchronized HttpConnection newInstace(){
if (mHttConnection == null){
synchronized (HttpConnection.class){
mHttConnection = new HttpConnection();
}
}
return mHttConnection;
}
//获取数据的方法,将subscriber作为回调接口
public void getData(int pageNum,Subscriber subscriber){
DataApi api = mRetrofit.create(DataApi.class);
Observable observable = api.getArticles(pageNum);
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
}

httpConnection

2、创建View

分析:根据我们的需求,我们只需要屏幕显示数据这一个动作就可以了,所以我们设计的View是这样的

//实现:创建接口并继承接口MvpView
public interface IArticleView extends MvpView{
//获取到数据,显示
void show(ArrayList<ArticleEntity> articleItem);
}

IArticle

3、设计Present类

同样,我们也只需要显示方法就可以了

public class ArticlePresent extends MvpBasePresenter<IArticleView> {
private int mViewPage = 0;
private HttpConnection mConnection;
@Override
public void attachView(IArticleView view) {
super.attachView(view);
mConnection = HttpConnection.newInstace();
}
//获取数据,并处理,然后传递给View的中转站
public void show(){
//获取上步骤的View
final IArticleView view = getView();
if (view != null){
Subscriber subscriber = new Subscriber() {
@Override
public void onCompleted() {
Log.d("MainActivity","完成了");
} @Override
public void onError(Throwable e) { } @Override
public void onNext(Object o) {
//当获取到了数据,就调用View的方法
view.show((ArrayList<ArticleEntity>)o);
}
};
//获取相关数据
mConnection.getData(mViewPage,subscriber);
}
} }

ArticlePresnt

4、MainActivity显示数据

BaseMvpActivity  继承MvpBaseActivity 设计了一个基础封装方法,封装了一些基础方法,

泛型:是在类名后创建的        泛型是在方法的返回值前创建的

public abstract class BaseMvpActivity <V extends MvpView,T extends MvpPresenter<V>>extends MvpActivity<V,T> {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView(savedInstanceState);
setListener();
} public abstract void initView(Bundle savedInstanceState); public abstract void setListener(); public <VT extends View> VT getViewById(int id){
return (VT) findViewById(id);
}
}

BaseMvpActivity

public class MainActivity extends BaseMvpActivity<IArticleView,ArticlePresent> implements IArticleView{
private ListView mListView;
private ArticleAdapter mArticleAdapter;
@NonNull
@Override
public ArticlePresent createPresenter() {
return new ArticlePresent();
} @Override
public void initView(Bundle savedInstanceState) {
mListView = getViewById(R.id.main_listView);
mArticleAdapter = new ArticleAdapter(this,new ArrayList<ArticleEntity>());
mListView.setAdapter(mArticleAdapter);
} @Override
public void setListener() { } @Override
public void show(ArrayList<ArticleEntity> articleItem) {
mArticleAdapter.addArticles(articleItem);
}
}

MainActivity

步骤:继承BaseMvpActivity,继承刚才的IAcrticle接口

设计方式:将获取数据的类装入model中,然后指定View显示的接口方法(比如说:没数据时候显示什么界面,有数据的时候显示什么界面,里面的数据是不是不一样了)

在Present完成处理数据和根据不同数据调用View方法的逻辑。

简单的Mvp设计的更多相关文章

  1. NHIBERNATE的简单框架的设计

    NHIBERNATE的简单框架的设计 上次的 NHibernate的Session管理策略和NHibernateHelper 发布并提供下载,给NHibernate刚入门的同学们带来很多便利. 最近有 ...

  2. 信息安全系统设计基础课程实践:简单TUI游戏设计

    简单TUI游戏设计                目       录               一                      Curses库简介与基本开发方法             ...

  3. 简单的词法设计——DFA模拟程序

    实验一.简单的词法设计--DFA模拟程序 一.实验目的 通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证.通过对 DFA 模 ...

  4. 学员管理系统(简单的Django设计)

    学员管理系统(简单的Django设计) 学员管理系统 项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求.因此公司 ...

  5. 使用jmeter做简单的场景设计

    使用jmeter做简单的场景设计 Jmeter: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试.我之所以选择它,最重要的一点就是----开源 个人 ...

  6. 学习LSM(Linux security module)之四:一个基于LSM的简单沙箱的设计与实现

    嗯!如题,一个简单的基于LSM的沙箱设计.环境是Linux v4.4.28.一个比较新的版本,所以在实现过程中很难找到资料,而且还有各种坑逼,所以大部分的时间都是在看源码,虽然写的很烂,但是感觉收获还 ...

  7. Mockplus更快更简单的原型设计

    更快更简单的原型设计 https://www.mockplus.cn/ Mockplus,更快更简单的原型设计工具.快速创建原型,一键拖拽创建交互,团队协作省事省力.微软.华为.东软.育碧.Oracl ...

  8. 1、使用简单工厂模式设计能够实现包含加法(+)、减法(-)、乘法(*)、除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果。要求使用相关的工具绘制UML类图并严格按照类图的设计编写程

    1.使用简单工厂模式设计能够实现包含加法(+).减法(-).乘法(*).除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果.要求使用相关的工具绘制UML类图并严格按照类图的设计编写程 ...

  9. 一张图看Google MVP设计架构

    这段时间看了一下Google官方推出的MVP架构案例,决定把对MVP的理解用类图的形式表述一下.MVP架构的设计思想确实非常值得学习,大家如果还不是很了解MVP,建议抽时间去研究研究,相信对大家的架构 ...

随机推荐

  1. HttpURLConnection详解

    HttpURLConnection详解 07. 五 / J2EE / 没有评论   HttpURLConnection类的作用是通过HTTP协议向服务器发送请求,并可以获取服务器发回的数据. Http ...

  2. java版-JQuery上传插件Uploadify使用实例

    摘自:http://itindex.net/detail/47160-java-jquery-%E4%B8%8A%E4%BC%A0 运行效果: 包结构图: 后台JAVA逻辑: package com. ...

  3. 解决Eclipse编译器报错ClassNotFoundException:Org.hibernate.hql.ast.HqlToken

    最近开发遇到Eclipse编译器老是报出ClassNotFoundException:Org.hibernate.hql.ast.HqlToken [from User Where id=1] 的错误 ...

  4. Lucene学习总结之四:Lucene索引过程分析

    对于Lucene的索引过程,除了将词(Term)写入倒排表并最终写入Lucene的索引文件外,还包括分词(Analyzer)和合并段(merge segments)的过程,本次不包括这两部分,将在以后 ...

  5. c++基础五个题(二)

    一.c++中static的作用 1.隐藏:当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,static函数作用就是为了隐藏 2.可以保持变量的持久:存储在静态数据区的变 ...

  6. 玩sdr的朋友们,在rtl_tcp时,记得调整rtl_AGC和tuner_AGC啊

    我在rtl_tcp时没有调整这个,结果怎么也听不到声音啊 还有就是在搞rtl_tcp时,一定要网速跟得上,我用无线网络时就碰到了这个问题,声音总是一直断续着,郁闷死

  7. Android 中常用代码片段

    一:AsyncTask 的使用 (1)activity_main.xml <TextView android:id="@+id/tvInfo" android:layout_ ...

  8. Linux系统编程(17)——正则表达式进阶

    C的变量和Shell脚本变量的定义和使用方法很不相同,表达能力也不相同,C的变量有各种类型,而Shell脚本变量都是字符串.同样道理,各种工具和编程语言所使用的正则表达式规范的语法并不相同,表达能力也 ...

  9. C# Switch is Type

    常规用法: Type t = sender.GetType(); if (t == typeof(Button)) { var realObj = (Button)sender; // Do Some ...

  10. MAC 下cocos2d-x lua 使用dragonbones的方法

    项目使用db,网上查了半天全是vs和android的流程,没查到有mac的.这里记录一下. quick-cocos-x下的使用方法: a. 将dragonbones(放入ucocos2d_libs中) ...