任务:从网络上获取数据,然后显示在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. javascript在不同的浏览器处理事件

    实现javascript事件处理兼容问题,例子如下,可以实现大部分浏览器处理事件的问题 var btn = document.getElementById("btn"); if(b ...

  2. 每天一点css3聚沙成塔(一):transition

    transition 语法: transition:[ transition-property ] || [ transition-duration ] || [ transition-timing- ...

  3. SSH 概念及使用详解

    注意:转载请注明出处:http://www.programfish.com/blog/?p=124 SSH 基本概念 SSH 英文全称是secure shell,字面意思:安全的shell. SSH协 ...

  4. ZendFramework 两种安装方式

    1. 在线安装(基于composer) Zend 应用程序骨架 GitHub 地址: https://github.com/zendframework/ZendSkeletonApplication ...

  5. Backward Digit Sums(POJ 3187)

    Backward Digit Sums Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5495   Accepted: 31 ...

  6. TabHost刷新activity的方法

    在android中,使用tabHost的时候,如果tab被点击,该tab所对应的activity被加载了,从别的tab切换回来的时候,activity不会再次被创建了(onCreate),所以要想每次 ...

  7. java没有条件编译

    摘自http://maosidiaoxian.iteye.com/blog/1290740 条件编译绝对是一个好东西.如在C或CPP中,可以通过预处理语句来实现条件编译.代码如下: #IFDEF DE ...

  8. Virtual Friends(并查集+map)

    Virtual Friends Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. Ajax——ajax调用数据总结

    在做人事系统加入批量改动的功能中,须要将前台中的数据传给后台.后台并运行一系列的操作. 通过查询和学习了解到能够通过ajax将值传入到后台,并在后台对数据进行操作. 说的简单点.就是ajax调用后台的 ...

  10. 【Android开发经验】LayoutInflater—— 你可能对它并不了解甚至错误使用

    今天,看到了一篇文章讲LayoutInflater的使用方法.瞬间感觉自己对这个类确实不够了解,于是简单的看了下LayoutInflater类的源码.对这个类有了新的认识. 首先.LayoutInfl ...