[Android] Android MVP 架构下 最简单的 代码实现
Android MVP 架构下 最简单的 代码实现
首先看图:

上图是MVP,下图是MVC
解耦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:
本博客地址: wukong1688
本文原文地址:https://www.cnblogs.com/wukong1688/p/10794023.html
转载请著名出处!谢谢~~
[Android] Android MVP 架构下 最简单的 代码实现的更多相关文章
- 转:Android官方MVP架构示例项目解析
转自: http://www.infoq.com/cn/articles/android-official-mvp-architecture-sample-project-analysis 作者 吕英 ...
- MVP架构下解决 RxJava 自动解绑问题
背景 MVP 模式下使用 RxJava 处理网络访问的回调,当数据返回时 Presenter 调用绑定的 View 的方法. 定义 BasePresenter 如下: public class Bas ...
- android开发之res下的menu (xml+代码的形式)
转载请注明出处:http://blog.csdn.net/fth826595345/article/details/9199393 先来看Menu XML文件如何编写: <?xml versi ...
- Android之MVP架构
MVP(Model View Presenter)模式是由MVC模式发展而来的,在如今的Android程序开发中显得越来越重要.本篇文章简单讨论了MVP模式的思想. 啥是MVP MVP模式的主要思想是 ...
- MVP架构在xamarin android中的简单使用
好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑),怪 ...
- android开发学习---linux下开发环境的搭建&& android基础知识介绍
一.配置所需开发环境 1.基本环境配置 JDK 5或以上版本(仅有JRE不够) (http://www.oracle.com/technetwork/java/javase/downloads/ind ...
- libaio under MIPS architecture /在mips架构下使用的libaio
First, you can find libaio source in http://libaio.sourcearchive.com/ Second,download the libaio_0.3 ...
- Android MVP架构分析
App架构在Android开发者中一直是讨论比较多的一个话题,目前讨论较多的有MVP.MVVM.Clean这三种.google官方对于架构的态度一直是非常开放的,让开发者自主选择组织和架构app的方式 ...
- Android中的MVP架构分解和实现
1.概述 传统的Android开发架构通常是MVC模式. Model:业务逻辑和实体模型 View:相应于布局文件 Controllor:相应于Activity 单独从逻辑看起来很好,与我们做Web开 ...
随机推荐
- MySQL数据库篇之单表查询
主要内容: 一.单表查询的语法 二.关键字的执行优先级 三.简单查询 四.where约束 五.分组查询 group by 六.having过滤 七.查询排序 order by 八.限制查询的记录数 l ...
- Log4J的配置文件详解
来自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用来设置记 ...
- Opencv convertScaleAbs
void cv::convertScaleAbs( cv::InputArray src, // 输入数组 cv::OutputArray dst, // 输出数组 double alpha = 1. ...
- Opencv3 Robert算子 Sobel算子 拉普拉斯算子 自定义卷积核——实现渐进模糊
#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...
- spring aop两种配置方式
基于注解的Spring AOP开发 简单案例快速入门 定义目标类接口和实现类 /** * Created by zejian on 2017/2/19.*/ //接口类 public interfac ...
- Spring MVC拦截器(Interceptor )详解
处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 常见应用场 ...
- array_combine()
- Ubuntu命令行下安装、卸载、管理软件包的方法
一.Ubuntu中软件安装方法 1.APT方式 (1)普通安装:apt-get install softname1 softname2 -; (2)修复安装:apt-get -f install so ...
- mongodb学习-创建唯一索引(在已存在的集合创建)
如果在已存在的集合创建,可能会存在相同的值如下: 我们可以使用(2.x版本) db.users.ensureIndex({uid:1, name:1}, {unique:true, dropDups: ...
- libevent学习
libevent是一个开源的事件控制机制,如果不想陷入多进程或多线程的困扰,那么libevent将是很合适的工具. libevent提供了很多的API来管理和控制事件,可用于设计读.写.信号.定时等各 ...