简单的Mvp设计
任务:从网络上获取数据,然后显示在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设计的更多相关文章
- NHIBERNATE的简单框架的设计
NHIBERNATE的简单框架的设计 上次的 NHibernate的Session管理策略和NHibernateHelper 发布并提供下载,给NHibernate刚入门的同学们带来很多便利. 最近有 ...
- 信息安全系统设计基础课程实践:简单TUI游戏设计
简单TUI游戏设计 目 录 一 Curses库简介与基本开发方法 ...
- 简单的词法设计——DFA模拟程序
实验一.简单的词法设计--DFA模拟程序 一.实验目的 通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证.通过对 DFA 模 ...
- 学员管理系统(简单的Django设计)
学员管理系统(简单的Django设计) 学员管理系统 项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求.因此公司 ...
- 使用jmeter做简单的场景设计
使用jmeter做简单的场景设计 Jmeter: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试.我之所以选择它,最重要的一点就是----开源 个人 ...
- 学习LSM(Linux security module)之四:一个基于LSM的简单沙箱的设计与实现
嗯!如题,一个简单的基于LSM的沙箱设计.环境是Linux v4.4.28.一个比较新的版本,所以在实现过程中很难找到资料,而且还有各种坑逼,所以大部分的时间都是在看源码,虽然写的很烂,但是感觉收获还 ...
- Mockplus更快更简单的原型设计
更快更简单的原型设计 https://www.mockplus.cn/ Mockplus,更快更简单的原型设计工具.快速创建原型,一键拖拽创建交互,团队协作省事省力.微软.华为.东软.育碧.Oracl ...
- 1、使用简单工厂模式设计能够实现包含加法(+)、减法(-)、乘法(*)、除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果。要求使用相关的工具绘制UML类图并严格按照类图的设计编写程
1.使用简单工厂模式设计能够实现包含加法(+).减法(-).乘法(*).除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果.要求使用相关的工具绘制UML类图并严格按照类图的设计编写程 ...
- 一张图看Google MVP设计架构
这段时间看了一下Google官方推出的MVP架构案例,决定把对MVP的理解用类图的形式表述一下.MVP架构的设计思想确实非常值得学习,大家如果还不是很了解MVP,建议抽时间去研究研究,相信对大家的架构 ...
随机推荐
- HttpURLConnection详解
HttpURLConnection详解 07. 五 / J2EE / 没有评论 HttpURLConnection类的作用是通过HTTP协议向服务器发送请求,并可以获取服务器发回的数据. Http ...
- java版-JQuery上传插件Uploadify使用实例
摘自:http://itindex.net/detail/47160-java-jquery-%E4%B8%8A%E4%BC%A0 运行效果: 包结构图: 后台JAVA逻辑: package com. ...
- 解决Eclipse编译器报错ClassNotFoundException:Org.hibernate.hql.ast.HqlToken
最近开发遇到Eclipse编译器老是报出ClassNotFoundException:Org.hibernate.hql.ast.HqlToken [from User Where id=1] 的错误 ...
- Lucene学习总结之四:Lucene索引过程分析
对于Lucene的索引过程,除了将词(Term)写入倒排表并最终写入Lucene的索引文件外,还包括分词(Analyzer)和合并段(merge segments)的过程,本次不包括这两部分,将在以后 ...
- c++基础五个题(二)
一.c++中static的作用 1.隐藏:当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,static函数作用就是为了隐藏 2.可以保持变量的持久:存储在静态数据区的变 ...
- 玩sdr的朋友们,在rtl_tcp时,记得调整rtl_AGC和tuner_AGC啊
我在rtl_tcp时没有调整这个,结果怎么也听不到声音啊 还有就是在搞rtl_tcp时,一定要网速跟得上,我用无线网络时就碰到了这个问题,声音总是一直断续着,郁闷死
- Android 中常用代码片段
一:AsyncTask 的使用 (1)activity_main.xml <TextView android:id="@+id/tvInfo" android:layout_ ...
- Linux系统编程(17)——正则表达式进阶
C的变量和Shell脚本变量的定义和使用方法很不相同,表达能力也不相同,C的变量有各种类型,而Shell脚本变量都是字符串.同样道理,各种工具和编程语言所使用的正则表达式规范的语法并不相同,表达能力也 ...
- C# Switch is Type
常规用法: Type t = sender.GetType(); if (t == typeof(Button)) { var realObj = (Button)sender; // Do Some ...
- MAC 下cocos2d-x lua 使用dragonbones的方法
项目使用db,网上查了半天全是vs和android的流程,没查到有mac的.这里记录一下. quick-cocos-x下的使用方法: a. 将dragonbones(放入ucocos2d_libs中) ...