简单的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方法的逻辑。

时间: 2024-08-06 03:11:03

简单的Mvp设计的相关文章

基于Qt的信号分析简单应用软件的设计

一.需求描述: 1.读取data.asc文件,分析其连续性: 2.绘制信号图像,并保存. 二.UI界面组成: 该应用的UI由以下几个控件组成: 3个PushButton:打开文件.图像保存.退出: 1个Combox:下拉框用于信号的选择: 1个Widget:用于确定绘图区域的坐标,并在Widget部件上绘制图像曲线. 3个Label:用于标注注释,及坐标轴 三.主要功能的实现 信号分析结果如下: 其中最主要的涉及信号数据的标准化处理,标准化处理计算公式: std=(当前信号值-此类信号的最小值)

简单计算器的设计

#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UILabel *show; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typical

简单的MVP框架搭建

1.MVP框架介绍: 最近公司内部培训,正好理一下项目的架构,目前最主要的产品还是用的MVP软件设计模式,就顺便查查资料来做个总结. 1.1什么是MVP? MVP是Model-View—Presenter的缩写,从网上找到的资料来看,大多数时候,对于MVP的介绍还是基于MVC,关注点基本上就集中在Presenter上面了,wiki上有个简单的说明(MVP模式),先从定义来大概理解下这个模式: 1.2MVP各自的使用规则和相互的交互 这三个模块,一般情况下,对于view的理解是没什么争议的,就是界

一张图看Google MVP设计架构

这段时间看了一下Google官方推出的MVP架构案例,决定把对MVP的理解用类图的形式表述一下.MVP架构的设计思想确实非常值得学习,大家如果还不是很了解MVP,建议抽时间去研究研究,相信对大家的架构设计能力和编码能力都会有所提高.当然,除了Google官方的案例,网上也有很多关于MVP架构的技术文章和案例,大家可以搜一搜,看一看,学习学习!好了,我就不赘述MVP的设计思想了,直接上图! 以上就是我对Google MVP架构的一个简单认识,目前可能还理解得不够深刻,如果以后有了更深刻的领悟,我会

servlet极简单权限拦截设计处理

在java web的开发中 遇到的极其简单的权限控制,整个小项目就分为四五种用户的权限角色,因此不想考虑使用框架以及数据库建角色表,菜单表,操作表等来完成权限设计,而是采用反射,注解的简单方法完成. 核心代码 BaseServlet.java文件 package com.zk.servlet; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; im

java web简单权限管理设计

一套最基本的权限管理包括用户.角色.资源. 数据库设计 我的设计如下: 用户:user 角色:role 用户-角色:user_role 资源:resource(包括上级菜单.子菜单.按钮等资源) 角色-资源:role_resource 标准的权限管理系统设计为以上5张表. 注:用户.用户-角色我就不做说明了,这两个是很简单的两块,用户的crud,以及为用户分配角色(多对多的关系)稍微琢磨一下就清楚了,下面都是针对为角色分配权限的实现 后台实现 展示层采用ztree树 <%@ page conte

帮初中同学做的简单的课程设计

因为同学没学链表,结构体,只能简单并且麻烦的做了一个课程设计.内容为存储学生信息和考试成绩,对成绩单进行编辑,排序,删除,显示等功能. 代码如下: 1 #include <stdio.h> 2 #include <conio.h> 3 #include <string.h> 4 #define NUMSTU 5000 /*最大学生人数*/ 5 #define NUMSCORE 4 /*成绩个数*/ 6 #define NAMELEN 100 /*姓名的最大长度<1

简单的权限设计

原来做OA的时候一直不知道权限怎么写. 受到原来粗粒度权限控制的观念影响,所以将问题复杂化了让我不知道怎么下笔. 原先的粗粒度控制权限: 书写一个过滤器,过滤器的映射范围即权限控制的范围. 游客只能访问公共的部分jsp或者controller. 我的例子的权限分为3个地方: 游客.用户.管理员. 所以写一个或者两个过滤器.在访问指定内容前进行session或者application中的身份信息验证,然后通过与否. 过滤器控制多个jsp主要是通过jsp的命名规范和文件夹规范,利用通配符*实现.控制

Android MVP设计框架模板 之 漂亮ListView上拉刷新下拉加载更多

mvp的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理.MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller. 项目中大部分是面对接口编程,通过P层可以预先将所有需要的接口功能