任务:从网络上获取数据,然后显示在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. jquery判断表单提交是否为空

    <input type="text" value="" name="toPage"> 判断该表单是否为空 var p = $(& ...

  2. 【Solr专题之九】SolrJ教程

    一.SolrJ基础 1.相关资料 API:http://lucene.apache.org/solr/4_9_0/solr-solrj/ apache_solr_ref_guide_4.9.pdf:C ...

  3. JavaScript 全局变量命名空间生成函数

    <script type="text/javascript"> var GLOBAL = {}; GLOBAL.namespace = function(str){ v ...

  4. 如何只克隆git仓库中的一个分支?

    git clone -b 例如: git clone -b 指定的分支名字

  5. PHP使用curl伪造IP地址和header信息

    curl虽然功能强大,但是只能伪造$_SERVER["HTTP_X_FORWARDED_FOR"],对于大多数IP地址检测程序来说,$_SERVER["REMOTE_AD ...

  6. fence repair(队列水过)

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 32916   Accepted: 10638 点我 ...

  7. display:table-cell的惊天作用,直接惊呆你!

    一 display:table-cell介绍 ... 二 用法 (1)高度不固定元素,垂直居中 ... (2)高度不固定列表元素,登高排列 ... (3)宽度不固定元素,平均分配 ...

  8. js区分移动设备与PC

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. HtmlAgilityPack - 简介

    HtmlAgilityPack是.net下的一个HTML解析类库.支持用XPath来解析HTML.这个意义不小,为什么呢?因为对于页面上的元素的xpath某些强大的浏览器能够直接获取得到,并不需要手动 ...

  10. 《how to design programs》第10章表的进一步处理

    返回表的函数: 下面是一个求工资的函数: ;; wage : number  ->  number ;; to compute the total wage (at $12 per hour) ...