MVP框架搭建

MVP架构模式详解 MVP(Model-View-Presenter)架构通过将应用程序分为三个主要组件,实现了关注点分离,提高了代码的可维护性、可测试性和可读性。它特别适用于需要清晰结构和高测试覆盖率的中大型应用程序。虽然MVP架构存在一些挑战,如代码量增加、学习曲线和潜在的Presenter膨胀问题,但通过遵循最佳实践和合理规划,这些问题可以得到有效缓解。随着技术的发展,MVP也在不断演进,与新的技术和模式结合,继续发挥其价值。 阅读详情

记得创建module,首先创建Base层

 创建Presenter层

package com.example.Presenter;

import java.lang.ref.WeakReference;

import io.reactivex.disposables.CompositeDisposable;

/**
 * 由于使用MVP可能会遇到内存泄漏的问题,所以需要引用的形式来处理,当内存对象被回收时,可以及时回收p层,避免内存泄漏
 * 强引用User user=new User()强引用,就是普通的引用形式,如果一个对象拒用强引用,用垃圾回收(GC)
 * 软引用softRrferece<String> username 在内存不足的时候会被回收,不会OOM
 * 弱引用WeakREference<String> username放发生Gc的时候,会被直接回收掉弱引用对象,不管空间是否足够,都会被回收
 * 虚引用PhantomRerence 幽灵引用,尽量不要用,没有办法去实例一个对象,对这个对象发生命周期完全没有影响
 */
public class BasePresenter<V>{
   WeakReference<V>weakReference;//使用弱引用声明一个V层,当发生Gc时,可以回收掉

  protected CompositeDisposable disposable=new CompositeDisposable();//作为p层的回收条件,避免P层出现内存泄漏

   //当声明一个V层的时候,需要把这个V层加入到软引用
   public void attachView(V view){
      if (weakReference==null){
         weakReference=new WeakReference<V>(view);
      }
   }
   //当一个V层需要销毁时,需要置空C层和P层的声明
   public void distach(){
      if (weakReference!=null){
         weakReference.clear();
         weakReference=null;
      }
      if (disposable!=null){
         disposable.clear();
         disposable=null;
      }
   }
   //此方法用于判断当前的V层是否加入到了软引用,weakReference.get()相当于取出V层
  public Boolean isAttach(){
      return weakReference!=null&&weakReference.get()!=null;
  }
  //从软引用取出当前的View
   public V getView(){
      if (weakReference!=null&&weakReference.get()!=null){
         return weakReference.get();
      }
      return null;
   }

}

创建View:BaseActivity

package com.example.view;

import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.example.Presenter.BasePresenter;

public abstract class BaseActivity<V,P extends BasePresenter> extends AppCompatActivity {
    protected  P presenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(bindLayoutld());
        initView();
        initData();
        if (presenter!=null){
            presenter.attachView((V)this);
        }
    }
    protected abstract void initData();

   protected abstract void initView();

   protected abstract int bindLayoutld();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (presenter!=null){
            presenter.distach();
        }
    }
}

创建View:BaseFagment

 

创建实现层

创建Api接口

package com.example.rejinster.net;

import com.example.Base.Base1;
import com.example.Base.JavaB;

import io.reactivex.Observable;
import retrofit2.http.POST;
import retrofit2.http.Query;

public interface ApiService {
    @POST("/user/register")
    Observable<JavaB> register(@Query("username")String username,
                               @Query("password")String password,
                               @Query("repassword")String repassword);
}

创建BaseRetrofitManger管理

package com.example.rejinster.net;

import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * 请求管理
 * 封装Retrofit,使用单例模式对外暴露一个实例
 */
public class RetrofitManger {
    private RetrofitManger(){

    }

    private static RetrofitManger retrofitManger=null;

    public static RetrofitManger getInstance(){
        if (retrofitManger==null){
            retrofitManger=new RetrofitManger();
        }
        return retrofitManger;
    }

    //网络请求框架的实例
    private Retrofit retrofit;

    public Retrofit getRetrofit(){
        if (retrofit==null){
            OkHttpClient client=
                    new OkHttpClient.Builder().addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
                            .addInterceptor(new Interceptor() {
                                @Override
                                public Response intercept(Chain chain) throws IOException {
                                    Request request = chain.request().newBuilder().addHeader(
                                            "token", "asdasd"
                                    ).build();
                                    return chain.proceed(request);
                                }
                            })
                            .build();
            retrofit=new Retrofit.Builder()
                    .baseUrl("http://43.143.146.165:7777/")
                    .client(client)
                    .addConverterFactory(GsonConverterFactory.create())//添加类型转换工厂,可以不手动转换,直接返回楚ban类
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//线程切换的适配器
                    .build();
        }
        return retrofit;
    }
}

创建BaseMode

package com.example.rejinster.day3mvp;

import com.example.rejinster.net.ApiService;
import com.example.rejinster.net.RetrofitManger;

/**
 * 所有数据模型的基准
 */
public class BaseModel {
    protected ApiService apiService;

    public BaseModel(){
        //拿到整个项目的接口实现
        apiService= RetrofitManger.getInstance().getRetrofit().create(ApiService.class);
    }
}

创建P层RsgisinPresentera接口

package com.example.rejinster.presenter;



import com.example.Base.JavaB;

import io.reactivex.Observable;

public interface RsgisinPresentera {
    //M层主要功能负责网络请假返回的bean类
    interface  Model{
        Observable<JavaB> register(String username, String password, String repassword);
    }
    //P层主要功能负责触发网络连接
    interface Presenter{
        void register(String username,String password,String repassword);
    }
    //V层
    interface View{
        //拿到的数据
        void OnRegister(JavaB javaB);
        //报错信息
        void OnRegisterFalied(String error);
    }
}

创建Model层

import com.example.Base.JavaB;
import com.example.rejinster.day3mvp.BaseModel;
import com.example.rejinster.presenter.RsgisinPresentera;

import io.reactivex.Observable;

public class RegistiModel extends BaseModel implements RsgisinPresentera.Model {


    @Override
    public Observable<JavaB> register(String username, String password, String repassword) {
        return apiService.register(username, password, repassword);
    }
}

创建P层ResdistPresenter

package com.example.rejinster.presenter;

import com.example.Base.JavaB;
import com.example.Presenter.BasePresenter;
import com.example.rejinster.Model.RegistiModel;

import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

public class ResdistPresenter extends BasePresenter<RsgisinPresentera.View>implements RsgisinPresentera.Presenter {

    RegistiModel model=new RegistiModel();


    @Override
    public void register(String username, String password, String repassword) {
      model.register(username, password, repassword)
              .subscribeOn(Schedulers.io())//执行耗时操作的时,在io线程中,也就是子线程
              .observeOn(AndroidSchedulers.mainThread())//当观测对象发生改变时,运行在ul线程
              .subscribe(new Observer<JavaB>() {
                  @Override
                  public void onSubscribe(Disposable d) {
                      //这个会调用填写P层防止内存泄漏
                      disposable.add(d);
                  }

                  @Override
                  public void onNext(JavaB javaB) {
                      //请求回调的结果,会回调出bean类
                      if (isAttach()){
                          //如果当前View层已经绑定在弱引用中,则咱们可以获取View
                          getView().OnRegister(javaB);
                      }
                  }

                  @Override
                  public void onError(Throwable e) {
                      //请求发生错误时的回调
                      getView().OnRegisterFalied(e.getMessage());
                  }

                  @Override
                  public void onComplete() {
                   //请求完成时发生的回调
                  }
              });
    }
}

实现V层

package com.example.rejinster.view;

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.alibaba.android.arouter.launcher.ARouter;
import com.example.Base.JavaB;
import com.example.day3mvp.R;
import com.example.rejinster.presenter.ResdistPresenter;
import com.example.rejinster.presenter.RsgisinPresentera;
import com.example.view.BaseActivity;

public class RegisterActivity extends BaseActivity<RsgisinPresentera.View, ResdistPresenter> implements RsgisinPresentera.View {

    private EditText registerUsername;
    private EditText registerPassword;
    private EditText registerRepassword;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        initView();
    }

    @Override
    protected void initData() {
        presenter = new ResdistPresenter();
    }

    public void initView() {
        registerUsername = (EditText) findViewById(R.id.register_username);
        registerPassword = (EditText) findViewById(R.id.register_password);
        registerRepassword = (EditText) findViewById(R.id.register_repassword);
    }

    @Override
    protected int bindLayoutld() {
        return R.layout.activity_register;
    }

    @Override
    public void OnRegister(JavaB javaB) {
        if (javaB.getErrorCode()==200){
            Toast.makeText(this, "注册成功"+javaB.getData().getNickname(), Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void OnRegisterFalied(String error) {
        Toast.makeText(this, "error"+error, Toast.LENGTH_SHORT).show();

    }

    public void register(View view) {
        String usernameString = registerUsername.getText().toString();
        String passwordString = registerPassword.getText().toString();
        String rePasswordString = registerRepassword.getText().toString();
        presenter.register(usernameString, passwordString, rePasswordString);
         //传值
        ARouter.getInstance().build("/text/login")
                .withString("username",usernameString)
                .withString("password",passwordString)
                .navigation();
    }
}

可以根据上面的展示图看,登录注册解串全可以根据实现层修改

Android MVP框架搭建与使用(含源码) 其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。下图是我进阶学习所积累的历年腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节祝大家都能得到自己心仪工作。《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!> tag。 阅读详情

相关推荐

Android MVP框架搭建

概述 MVP简介(VIew-Model-Presenter) Presenter整个功能的服务者,当用户通过界面(View)与应用进行交互或潜在交互时,界面将有效事件上报给Presenter,Presenter则根据事件需求进行处理,包括与数据(Model)之间的交互。形象来说就是:MVP就是一个非自助式餐厅,顾客就相当于我们的用户,餐厅本身相当于View,餐厅工作人员相当于Presenter,...

qq_24708503的博客 260

Android技术框架篇(二):MVP框架

mvp架构的介绍

看,好自为之的博客!!! 6627

HWDB1.1数据集处理全攻略:从gnt文件到PNG图片的完整转换教程

本文提供了HWDB1.1数据集处理的完整教程,详细解析了gnt二进制文件格式,并给出了从文件解析、标签映射到批量转换为PNG图片的Python脚本。教程涵盖了环境准备、跨平台解压方案,以及为PyTorch等深度学习框架准备数据的最佳实践,是进行手写汉字识别研究不可或缺的实用指南。

2w3e4r5t6y的博客 622

谈谈对MVP框架模式的理解(工作总结)

工作几年,发现代码写的越久,写代码前考虑的东西越多,越小心也越慢了。如果之前总是20%编码时间需要80%时间来debug和维护,那现在当然希望debug所占的时间越少越好,在编码之前更多的构思和设计,尽可能规避可能出现的问题。 不知道从什么时候开始,项目进度总是在拖着我们往前疯狂地写需求,打补丁,当脏代码越来越多,结构越来越臃肿,我们开始想起来一个叫架构的东西。然后又开始计划重构代码,甚至重新设计框架,可惜一堆接一堆的新bug等着去解,重构计划一拖再拖,似乎这才是该做的事情,慢慢忘记了软件里那些真正绚丽的

Ctrlturtle的博客 7238

从零到一:YT8512C PHY芯片在STM32F407上的LWIP移植实战与避坑指南

本文详细介绍了YT8512C PHY芯片在STM32F407平台上基于LWIP协议栈的移植实战,涵盖硬件连接、CubeMX配置、寄存器定制和调试技巧。重点解析了与主流PHY芯片的差异,提供了完整的避坑指南和优化建议,帮助开发者快速实现稳定可靠的嵌入式网络连接。

uber9的博客 531

408——计算机组成原理(持续更新)

小数点前的0代表正数,1代表负数。

qq_55202378的博客 1711

MVP和MVVM架构总结

负责数据的存储、获取和业务逻辑处理。例如,在一个用户管理系统中,Model 层会包含数据库操作,如查询用户信息、更新用户密码等操作相关的代码。它是独立于视图层的,不关心数据如何展示,只专注于数据本身的管理和业务规则的实现。

2301_79847249的博客 2044

如何下载最新版本的VMware Workstation

随着虚拟化技术的发展,VMware Workstation作为行业领先的桌面虚拟化软件,为用户提供了在单一物理计算机上运行多个操作系统的能力。本文将详细介绍如何从Broadcom支持网站下载最新的VMware Workstation Pro版本。

安呀智数据坊的博客 658

android 最新的框架搭建,Android之Mvp模式框架搭建

前言在做Android开发时,我们通常为了更合理,更高效,优质的开发项目,并不是直接上来就开始开发功能,而是先搭建好自己的一个开发框架,一个好的开发框架,通常会让我们事倍功半,它就好比我们去建造一个房子,如果你的地基打的越深,越牢固,那么就可以建造出很高很大的房子.在搭建一个框架前,我们先要考虑一下,这个框架要达到一个什么样的效果,主要从下面三点来进行考虑:降低项目的复杂度易扩展,易修改,可用性强...

weixin_31151281的博客 293

用GraphPad Prism直出单细胞亚群堆叠柱状图

用GraphPad Prism直出单细胞亚群堆叠柱状图

fivehuge的博客 4190

win10锁屏或登录时会自动弹出触摸按键的问题解决办法

本篇文章主要讲解win10锁屏或登录时会自动弹出触摸按键的问题解决方式。日期:2023年5月17日作者:任聪聪。

任聪聪的博客 1万+

Android之Mvp模式框架搭建

    前言 在做Android开发时,我们通常为了更合理,更高效,优质的开发项目,并不是直接上来就开始开发功能,而是先搭建好自己的一个开发框架,一个好的开发框架,通常会让我们事倍功半,它就好比我们去建造一个房子,如果你的地基打的越深,越牢固,那么就可以建造出很高很大的房子. 在搭建一个框架前,我们先要考虑一下,这个框架要达到一个什么样的效果,主要从下面三点来进行考虑: 降低项目的...

gxflh的博客 519

微服务架构下服务注册与发现与治理机制

服务注册中心:注册中心核心功能+实现策略,讲解注册中心核心功能和注册中心实现策略+服务发布与注册+服务发现与调用+服务监控

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 169万+

mvp框架搭建

https://www.jianshu.com/p/543c2bec5183

baidu_33575737的博客 338

Dify智能体开发:Dify文件上传

相较于聊天文本,文档文件能够承载大量的信息,例如学术报告、法律合同。受限于 LLM 自身仅能够支持文件或图片,难以获取文件内更加丰富的上下文信息,应用的使用者不得不手动复制粘贴大量信息与 LLM 对话,增加了许多不必要的使用成本。

王国平的博客 2587

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

从零到一搭建一个mvp框架

从零到一搭建一个mvp框架 对于mvp不了解的看这篇文章 mvp讲解 正文开始 在里面新建两个接口(Interface),分别取名 BaseView 和 BaseModel,这里定义一些公共方法 public interface BaseView { void showLoading(); void hideLoading(); void showError(); } public interface BaseModel { }

zyz18813049204的博客 803

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MVP模式开发之项目框架的搭建

这段时间的感慨其实在之前那一篇MVP模式中大概的对MVP模式做了一个阐述,但是实际运用中要考虑到蛮多的细节性问题 ,而且感觉这次MVP开发的十分顺畅,虽然用户端这边是我一个人开发,数了下大概100多个类,1w行代码的样子。怎么说呢,这次中软杯,由于我不是弄算法这块的,对于Android端我把我现在能做的最好水平做出来了。 虽然做到最后做的想吐了(一个人在各种model、view、p

潘浩的博客 3258

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android 天气APP(四)搭建MVP框架与使用

上一篇:Android 天气APP(三)访问天气API与数据请求   在上一篇文章中通过OkHttp请求成功获取了城市的LocationID,而如果每一个请求我们就这样写一个无疑是很麻烦的事情,因此我们需要封装一下,而既然是新版的内容,我们封装的方式就会和原来不同,不再使用MVP模式,而采用MVVM模式。为了方便你做迁移,我就新增一个library moudle,里面就做MVVM的一些封装和处理,以及网络框架的处理,鼠标右键点击你的工程,最后点击Module。这里就直接命名为library。点击Finish

晨曦 1万+

Android MVP 框架搭建

本文主要根据自身项目的使用和对MVP的理解,搭建符合自身项目情况的MVP架构。

MingYang 6256

搭建属于自己的Android MVP 框架

本文主要是结合自己对MVP的理解搭建了符合自身业务场景的MVP框架。 先放一个Demo地址,文章末尾也有 关于MVP M(Model)负责数据的请求,解析,过滤等数据操作。 V(View)负责处理UI,通常以Activity Fragment的形式出现。 P(Presenter)View Model中间件,交互的桥梁。 上图引用自此 MVP的好处 分离了UI逻辑和业务逻辑,降低了耦合。...

weixin_34318956的博客 254

android mvp框架搭建_【Android】一键生成MVP代码-DevMvp快速开发框架

序言每个程序员看到一堆烂代码都有一颗重构的心。烂代码写起来嘴上 笑嘻嘻,心里mmp。特别是有代码洁癖的人。重构不易且行且珍惜,此框架将减少开发时间。如果你们的项目结构跟我的不一样,这也不用担心,你看了我这个,简单修改一下模板,照样能生成你想要的代码。MVP架构相信大家对于MVP耳熟能详了,理解的直接往下看,如果概念比较模糊,可以网上查一查理解理解,我这边简单的介绍一下,可以配合下图来理解View层...

weixin_36334361的博客 517

MVP + Retrofit + RxJava 搭建一个基础的Android开发框架

1. 搭建一个简易的Android开发结构,避免新手开发时出现代码混乱的问题; 2. 包含一个基础的框架搭建,讲解都在注释里

啥都靠学 3380

MVP+retrofit+rxjava框架搭建及使用

      现在几乎大部分的项目都在使用MVP+retrofit+rxjava,不管你承不承认,现在的趋势就是这样子,作为一个android开发,你必须适应潮流,与时俱进。主流的框架搭建,主流的开源框架使用,是必须要会的。来到新公司,我为手下的人进行了一次培训,主要是如何进行常规项目框架搭建,级如何使用rxjava+retrofit的网络框架(此处不讲MVP,因为我觉得这东西很灵活,没有统一的标准...

qq_16177199的博客 2947
上一篇: 侧拉更换头像+VideoView视频实现+ARouter跳转
下一篇: 帧动画的创建和属性动画+侧拉窗口
搬砖猿小周
博客等级 码龄3年 4粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值