简单的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,建议抽时间去研究研究,相信对大家的架构 ...
随机推荐
- 从外部导入jar包的三种方式
我们在用Eclipse开发程序的时候,经常要用到第三方jar包.引入jar包不是一个小问题,由于jar包位置不清楚,而浪费时间.下面配图说明3种Eclipse引入jar包的方式. 1.最常用的普通操作 ...
- 解决mysql中文存储问题
在mysql安装目录下先找到my.ini,给[mysql]和[mysqld]下的default-character-set赋值为utf8 即改为:default-character-set=utf8 ...
- python成长之路第三篇(4)_作用域,递归,模块,内置模块(os,ConfigParser,hashlib),with文件操作
打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.作用域 2.递归 3.模块介绍 4.内置模块-OS 5.内置模块-ConfigParser 6.内置模块-has ...
- 一次oracle大量数据删除经历
oracle有个数据表现在已经有2500万条数据了,软件用到这个表的数据时就变的特别慢,所以准备把一个月以前的数据全部清除. 我的步骤是(下边操作都是在plsql中运行的) 1.首先 将这个月的数据导 ...
- sql helper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...
- LUN----逻辑单元号
LUN的全称是Logical Unit Number,也就是逻辑单元号. 一.概念 LUN的全称是Logical Unit Number,也就是逻辑单元号.我们知道SCSI总线上可挂接的设备数 ...
- Linux的环境变量配置
以下都是环境变量相关的配置文件 1)/etc/enviroment 是系统的环境变量. (2)/etc/profile: 是所有用户的环境变量.当用户第一次登录时,该文件被执行. 并从/etc/pro ...
- 软件体系结构经典问题——KWIC的分析和解决
KWIC作为一个早年间在ACM的Paper提出的一个问题,被全世界各个大学的软件设计课程奉为课堂讲义或者作业的经典.(From Wiki,FYI,D. L. Parnas uses a KWIC In ...
- [置顶] 玩转Eclipse — 自动注释插件JAutodoc
代码注释是一种良好的编程习惯.不管对于他人还是自己,注释都有助于代码的阅读和理解.手动添加注释,是一个非常费时和繁琐的工作,严重影响软件开发效率,这也是绝大多数程序员不愿添加注释的主要原因.JAuto ...
- mysql 保留的关键字
mysql> select precision from Product; ERROR 1064 (42000): You have an error in your SQL syntax; c ...