Android  MVP 架构下  最简单的 代码实现

首先看图:

上图是MVP,下图是MVC

MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互。而在mvp中,view层只和presenter层交互,而model层也和presenter交互,presenter构成了view层和model层的桥梁,也解耦了view层和model层。这一点很关键。我认为,这也是mvp的本质:

解耦view层和model层,让view层和model层通过presenter层进行通信。换个说法就是让诸如网络请求,数据库读写的逻辑,从activity中剥离出来。activit只负责页面的展示,不关心model层的逻辑。

简单的MVP模式,3个class 和 1个interface 就可以实现

各文件主要功能如下:

1个interface:定义activity 要实现的回调方法

3个class:1个Model层定义文件 +  1个业务逻辑 Presenter文件  + 1个Activity文件

列举实现代码

1)interface定义文件

MainCallBack.java

package com.jack.basemvp.basemvp;

/**
* 定义要实现的回调方法
*/
public interface MainCallBack {
void getMessage(String message);
void error();
}

2)Model层文件

MainModel.java

package com.jack.basemvp.basemvp;

import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request; /**
* 定Model
*/
public class MainModel {
public Call getData(String url) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
return client.newCall(request);
}
}

3)Presenter层文件

MainPresenter.java

package com.jack.basemvp.basemvp;

import android.support.annotation.NonNull;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response; /**
* 定义业务逻辑 Presenter
*/
public class MainPresenter {
private MainCallBack callBack;
private MainModel model; public MainPresenter(MainCallBack callBack) {
this.callBack = callBack;
model=new MainModel();
} public void getUrlData(String url){
model.getData(url).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
callBack.error();
} @Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
callBack.getMessage(response.body().string());
}
});
} }

4)activity调用

SimpleMvpActivity.java

package com.jack.basemvp.activity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; import com.jack.basemvp.R;
import com.jack.basemvp.basemvp.MainCallBack;
import com.jack.basemvp.basemvp.MainPresenter; import java.lang.ref.WeakReference; public class SimpleMvpActivity extends AppCompatActivity implements View.OnClickListener,MainCallBack{
public EditText simple_et;
Button btn_submit_req;
TextView simple_tv; private MainPresenter presenter;
private MyHandler handler; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple_mvp); simple_et = (EditText) findViewById(R.id.simple_et);
btn_submit_req = (Button) findViewById(R.id.btn_submit_req);
simple_tv = (TextView) findViewById(R.id.simple_tv); handler = new MyHandler(this);
presenter = new MainPresenter(this); btn_submit_req.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_submit_req:
String url = simple_et.getText().toString();
presenter.getUrlData(url);
break;
}
} @Override
public void getMessage(String message) {
Message msg = handler.obtainMessage(, message);
handler.sendMessage(msg);
} @Override
public void error() {
Message msg = handler.obtainMessage(, "error");
handler.sendMessage(msg);
} private static class MyHandler extends Handler {
private WeakReference<SimpleMvpActivity> reference; private MyHandler(SimpleMvpActivity activity) {
reference = new WeakReference<>(activity);
} @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
SimpleMvpActivity activity = reference.get();
switch (msg.what) {
case :
activity.simple_tv.setText(msg.obj.toString());
break;
case :
activity.simple_tv.setText(msg.obj.toString());
break;
}
}
}
}

具体代码见Github:

https://github.com/wukong1688

本博客地址: wukong1688

本文原文地址:https://www.cnblogs.com/wukong1688/p/10794023.html

转载请著名出处!谢谢~~

[Android] Android MVP 架构下 最简单的 代码实现的更多相关文章

  1. 转:Android官方MVP架构示例项目解析

    转自: http://www.infoq.com/cn/articles/android-official-mvp-architecture-sample-project-analysis 作者 吕英 ...

  2. MVP架构下解决 RxJava 自动解绑问题

    背景 MVP 模式下使用 RxJava 处理网络访问的回调,当数据返回时 Presenter 调用绑定的 View 的方法. 定义 BasePresenter 如下: public class Bas ...

  3. android开发之res下的menu (xml+代码的形式)

    转载请注明出处:http://blog.csdn.net/fth826595345/article/details/9199393 先来看Menu  XML文件如何编写: <?xml versi ...

  4. Android之MVP架构

    MVP(Model View Presenter)模式是由MVC模式发展而来的,在如今的Android程序开发中显得越来越重要.本篇文章简单讨论了MVP模式的思想. 啥是MVP MVP模式的主要思想是 ...

  5. MVP架构在xamarin android中的简单使用

    好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑),怪 ...

  6. android开发学习---linux下开发环境的搭建&& android基础知识介绍

    一.配置所需开发环境 1.基本环境配置 JDK 5或以上版本(仅有JRE不够) (http://www.oracle.com/technetwork/java/javase/downloads/ind ...

  7. libaio under MIPS architecture /在mips架构下使用的libaio

    First, you can find libaio source in http://libaio.sourcearchive.com/ Second,download the libaio_0.3 ...

  8. Android MVP架构分析

    App架构在Android开发者中一直是讨论比较多的一个话题,目前讨论较多的有MVP.MVVM.Clean这三种.google官方对于架构的态度一直是非常开放的,让开发者自主选择组织和架构app的方式 ...

  9. Android中的MVP架构分解和实现

    1.概述 传统的Android开发架构通常是MVC模式. Model:业务逻辑和实体模型 View:相应于布局文件 Controllor:相应于Activity 单独从逻辑看起来很好,与我们做Web开 ...

随机推荐

  1. c3p0、dbcp和proxool比较

    现在常用的开源数据连接池主要有c3p0.dbcp和proxool三种,其中: hibernate开发组推荐使用c3p0; spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样 ...

  2. Kafka存储机制(转)

    转自:https://www.cnblogs.com/jun1019/p/6256514.html Kafka存储机制 同一个topic下有多个不同的partition,每个partition为一个目 ...

  3. 【CodeForces - 235C】Cyclical Quest 【后缀自动机】

    题意 给出一个字符串s1和q个询问,每个询问给出一个字符串s2,问这个询问的字符串的所有不同的周期串在s1中出现的次数的和. 分析 对于s1建后缀自动机.对于询问的每个字符串s2,我们按照处理循环串的 ...

  4. android-tip-SocketException之ETIMEDOUT

    异常出现时间 如果我们有一个长连接,此时网络被关闭,或者暂时失去信号, 此时就会出现此异常. 如果出现此异常,则不得不重连.

  5. SpringBoot01 InteliJ IDEA安装、Maven配置、创建SpringBoot项目、yml属性配置、多环境配置、自定义properties配置

    1 IntelliJ IDEA 安装 下载地址:点击前往 注意:需要下载专业版本的,注册码在网上随便搜一个就行啦 2 MAVEN工具的安装 2.1 获取安装包 下载地址:点击前往 2.2 安装过程 到 ...

  6. &&与||的短路运算

    在谈&&和||两个运算符的短路运算之前,先看一段程序: #include <stdio.h> int main() { , para2 = , para3 = , para ...

  7. PHP微信授权登录信息

    文件1:index.php //换成自己的接口信息 $appid = 'XXXXX'; header('location:https://open.weixin.qq.com/connect/oaut ...

  8. code1214 线段覆盖

    贪心 把线段们按终止点b的先后排序,b小的在前面,b一样随便 然后设r为当前最大的b 每加入一条新的线段i,判断是否重合(i.a>=r) 如果重合就舍弃i,否则把i加入,ans++,更新r:r= ...

  9. sql insert、update、delete完以后返回主键ID

    以前只用过在insert完以后利用select @@IDENTITY返回主键ID,最近在做微信公众平台,遇到一个需求是在帮绑定万微信openid后自动完成登陆,这就需要update以后返回主键ID,查 ...

  10. nignx ssl 配置

    1. 找一个目录,例如: usr/local/nginx/ssl ,进入该目录 2.  openssl genrsa -des3 -out server.key 1024  创建自身秘钥 3.  op ...