Mosby MVP模式学习和教程,使用文档

MosbyMVI,使用mosby的hello world模型视图意图(mvi)示例.zip 我的文章涵盖了这个repo:用mvi构建反应性android应用程序 立即下载

索引

入门

MVP简介

MVP的出发点是关注点分离,将视图和业务逻辑解耦。Model-View-Presenter三个部分可以简单理解为:

  • Model是将在视图中显示的数据。
  • View是显示数据(model)的界面,同时将用户指令(事件)发送给Presenter来处理。View通常含有Presenter的引用。在Android中Activity,Fragment和ViewGroup都扮演视图的角色。
  • Presenter是中间人,同时有两者的引用。请注意单词model非常有误导性。它应该是获取或处理model的业务逻辑。例如:如果你的数据库表中存储着User,而你的视图想显示用户列表,那么Presenter将有一个数据库业务逻辑(例如DAO)类的引用,Presenter通过它来查询用户列表。

思考:MVC,MVP和MVVM之间有什么区别和联系?

消极视图:在MVP中,View是消极视图(Passive View),也就是说它尽量不去主动做事,而是让Presenter通过抽象方式控制View,例如Presenter调用view.showLoading()方法来显示加载效果,但Presenter不应该控制View的具体实现,例如动画,所以Presenter不应该调用view.startAnimation()这样的方法。

Mosby简介

设计目标:让你能用清晰的Model-View-Presenter架构来构建Android app。

注意:Mosby是一个库(library),不是一个框架(framework)。

思考:什么是library?什么是framework?它们的区别是什么?

Mosby的内核是一个基于委托模式(delegation)的很精简的库。你可以使用委托(delegation)和组合(composition)将Mosby集成到你的开发技术栈中。这样你就能避免框架(framework)带来的限制和约束。

思考:什么是委托模式?委托和继承的区别是什么?使用委托有什么好处?

依赖:

Mosby被分成模块,你可以选择你需要的功能:

dependencies {
    compile 'com.hannesdorfmann.mosby:mvp:2.0.1'
    compile 'com.hannesdorfmann.mosby:viewstate:2.0.1'
}

Hello MVP World

先来用Mosby MVP库来实现一个最简单的功能,页面有两个Button和一个TextView,需求如下:

  • 点击Hello按钮,显示红色文本 "Hello" + 随机数;
  • 点击Goodbye按钮,显示蓝色文本 "Goodbye" + 随机数;

这里假设随机数的生成过程涉及到复杂的业务逻辑计算,是一个耗时操作,需要2s时间。

第一步我们用一个AsyncTask来实现这个模拟的业务逻辑,在自定义的AsyncTask中,要定义一个监听器,用来传递业务逻辑执行结果:

public class GreetingGeneratorTask extends AsyncTask<Void, Void, Integer>{

    // Callback - listener
    public interface GreetingTaskListener{
        void onGreetingGenerated(String greetingText);
    }

    ......

    // 模拟计算过程,返回一个随机值。
    @Override
    protected Integer doInBackground(Void... params) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return (int)(Math.random() * 100);
    }

    @Override
    protected void onPostExecute(Integer randomInt) {
        listener.onGreetingGenerated(baseText + " " + randomInt);
    }
}

第二步定义视图接口,视图接口需要继承MvpView:

public interface HelloWorldView extends MvpView{

    void showHello(String greetingText);

    void showGoodbye(String greetingText);
}

注意这里的MvpView是所有视图的顶层接口,它是一个空接口,没有定义任何方法。

第三步实现Presenter,Presenter需要执行业务逻辑,并针对不同的执行结果调用视图的对应方法。

Presenter的顶层接口是MvpPresenter,它有两个方法:

public interface MvpPresenter<V extends MvpView> {

  /**
   * 将View附着到Presenter上
   */
  public void attachView(V view);

  /**
   * 在视图被摧毁时调用。典型场景是Activity.onDestroy()和Fragment.onDestroyView()方法
   */
  public void detachView(boolean retainInstance);
}

Mosby提供了MvpPresenter接口的基类实现,在这里我们继承MvpBasePresenter:

public class HelloWorldPresenter extends MvpBasePresenter<HelloWorldView>{

    private GreetingGeneratorTask greetingTask;

    private void cancelGreetingTaskIfRunning(){
        if (greetingTask != null){
            greetingTask.cancel(true);
        }
    }

    public void greetHello(){
        cancelGreetingTaskIfRunning();

        greetingTask = new GreetingGeneratorTask("Hello", new GreetingGeneratorTask.GreetingTaskListener() {
            @Override
            public void onGreetingGenerated(String greetingText) {
                if (isViewAttached()){
                    getView().showHello(greetingText);
                }
            }
        });
        greetingTask.execute();
    }

    ......

    @Override
    public void detachView(boolean retainInstance) {
        super.detachView(retainInstance);
        if (!retainInstance){
            cancelGreetingTaskIfRunning();
        }
    }
}

注意在detachView方法中取消后台任务的处理。

第四步实现Activity,让我们的Activity继承MvpActivity,并实现HelloWorldView接口。

MvpActivity有两个泛型,分别是Presenter和View的具体类型:

public class HelloWorldActivity extends MvpActivity<HelloWorldView, HelloWorldPresenter> implements HelloWorldView{
    ......
}

继承MvpActivity后,只有一个抽象方法createPresenter()需要实现:

public HelloWorldPresenter createPresenter() {
    return new HelloWorldPresenter();
}

HelloWorldView还有两个方法需要实现:

@Override
public void showHello(String greetingText) {
    greetingTextView.setTextColor(Color.RED);
    greetingTextView.setText(greetingText);

}

@Override
public void showGoodbye(String greetingText) {
    greetingTextView.setTextColor(Color.BLUE);
    greetingTextView.setText(greetingText);
}

点击按钮后,使用Presenter来完成相关操作:

@OnClick(R.id.helloButton)
public void onHelloButtonClicked(){
    presenter.greetHello();
}

@OnClick(R.id.goodbyeButton)
public void onGoodbyeButtonClicked(){
    presenter.greetGoodbye();
}

MvpPresenter的基类

Presenter默认实现一:使用弱引用保存视图引用,在调用getView()之前必须判断isViewAttached()。

public class MvpBasePresenter<V extends MvpView> implements MvpPresenter<V> {

  private WeakReference<V> viewRef;

  @Override public void attachView(V view) {
    viewRef = new WeakReference<V>(view);
  }

  @Nullable public V getView() {
    return viewRef == null ? null : viewRef.get();
  }

  public boolean isViewAttached() {
    return viewRef != null && viewRef.get() != null;
  }

  @Override public void detachView(boolean retainInstance) {
    if (viewRef != null) {
      viewRef.clear();
      viewRef = null;
    }
  }
}

Presenter默认实现二:使用Null Object Pattern,在调用getView()时无需判断。

public class MvpNullObjectBasePresenter<V extends MvpView> implements MvpPresenter<V> {

  private V view;

  @Override public void attachView(V view) {
    this.view = view;
  }

  @NonNull public V getView() {
    if (view == null) {
      throw new NullPointerException("MvpView reference is null. Have you called attachView()?");
    }
    return view;
  }

  @Override public void detachView(boolean retainInstance) {
    if (view != null) {

      Type[] types =
          ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();

      Class<V> viewClass = (Class<V>) types[0];
      view = NoOp.of(viewClass);
    }
  }
}

思考:什么是空对象模式(Null Object Pattern)?

基础

LCE视图

在开发Android应用过程中,我们会发现很多页面有相似的结构和UI逻辑,所以我们常常在写重复代码。如果能抽象出相似页面的View接口,然后封装页面的基类,就能让开发方便很多。Mosby就给我们提供了一个这样的视图模板,叫做LCE View。

LCE代表Loading-Content-Error(加载-内容-错误),此视图有三种状态:显示加载中,显示数据内容,或者显示错误视图。例如在如下的场景中:

假设我们要在ListView中显示一个国家列表,国家列表的数据是从网络获取的,是一个耗时操作。在加载过程中,我们要显示一个ProgressBar,如果加载出错,我们要显示一条错误信息。另外,还要用SwipeRefreshLayout来让用户可以下拉刷新。

LCE View的接口定义如下:

public interface MvpLceView<M> extends MvpView {

  /**
   * 显示加载视图,加载视图的id必须为R.id.loadingView
   */
  public void showLoading(boolean pullToRefresh);

  /**
   * 显示内容视图,内容视图的id必须为R.id.contentView
   *
   * <b>The content view must have the id = R.id.contentView</b>
   */
  public void showContent();

  /**
   * 显示错误视图,错误视图必须是TextView,id必须是R.id.errorView
   */
  public void showError(Throwable e, boolean pullToRefresh);

  /**
   * 设置将在showContent()中显示的数据
   */
  public void setData(M data);

  /**
   * 加载数据,此方法中常需要调用Presenter的对应方法。因此此方法不可在Presenter
   * 中使用,避免循环调用。
   * 参数pullToRefresh代表此次加载是否由下拉刷新触发。
   */
  public void loadData(boolean pullToRefresh);
}

思考:LCE视图中考虑了下拉刷新,但没有考虑上拉加载,如果服务器是分页接口,需要添加上拉加载,应该怎样定义视图接口?

MvpLceActivity和MvpLceFragment

Mosby封装了LCE视图的基类,现在我们用MvpLceActivity或MvpLceFragment来实现上面所说的加载国家列表的场景。

第一步完成界面布局,注意id必须使用上面指定的名称,错误视图只能是一个TextView:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ......>
    <include layout="@layout/loading_view" />
    <include layout="@layout/error_view" />
    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/contentView"
        ......>
        <ListView ....../>
    </android.support.v4.widget.SwipeRefreshLayout>
</FrameLayout>

第二步继承MvpLceView实现自己的视图接口,此处需要指定泛型,作为数据类型:

public interface CountriesView extends MvpLceView<List<Country>>{
}

第三部实现Presenter,在这里我们做了一个接口和一个实现:

接口定义:

public interface CountriesPresenter extends MvpPresenter<CountriesView>{

    void loadCountries(final boolean pullToRefresh);
}

具体实现:

public class SimpleCountriesPresenter extends MvpNullObjectBasePresenter<CountriesView>
        implements CountriesPresenter{

    ......

    @Override
    public void loadCountries(final boolean pullToRefresh) {
        getView().showLoading(pullToRefresh);

        ......

        countriesLoader = new CountriesAsyncLoader(++failingCounter % 2 != 0, new CountriesAsyncLoader.CountriesLoaderListener() {
            @Override
            public void onSuccess(List<Country> countries) {
                getView().setData(countries);
                getView().showContent();
            }

            @Override
            public void onError(Exception e) {
                getView().showError(e, pullToRefresh);
            }
        });

        countriesLoader.execute();
    }

    ......
}

上面代码中就使用到了MvpLceView中除loadData()外的全部四个方法。

第四步实现Activity或者Fragment,先以Activity为例,需要继承MvpLceActivity:

public class CountriesActivity extends MvpLceActivity<SwipeRefreshLayout, List<Country>, CountriesView, CountriesPresenter>
        implements SwipeRefreshLayout.OnRefreshListener, CountriesView{

MvpLceActivity中定义了四个泛型,分别是ContentView的类型,Data的类型,视图接口的类型和Presenter的类型。此处ContentView使用的是SwipeRefreshLayout。

继承MvpLceActivity后有两个方法需要实现:

@Override
protected String getErrorMessage(Throwable e, boolean pullToRefresh) {
    if (pullToRefresh) {
        return "Error while loading countries";
    } else {
        return "Error while loading countries. Click here to retry";
    }
}

@NonNull
@Override
public CountriesPresenter createPresenter() {
    return new SimpleCountriesPresenter();
}

实现CountriesView接口后,重写如下几个方法:

@Override
public void setData(List<Country> data) {
    adapter.clear();
    adapter.addAll(data);
    adapter.notifyDataSetChanged();
}

@Override
public void showContent() {
    super.showContent();
    contentView.setRefreshing(false);
}

@Override
public void showError(Throwable e, boolean pullToRefresh) {
    super.showError(e, pullToRefresh);
    contentView.setRefreshing(false);
}

@Override
public void loadData(boolean pullToRefresh) {
    presenter.loadCountries(pullToRefresh);
}

实现OnRefreshListener接口后,需要实现一个方法:

@Override
public void onRefresh() {
    loadData(true);
}

如果要用Fragment,方法基本上一样,只需继承MvpLceFragment,唯一的区别是,Activity的初始化在onCreate()中完成,Fragment的初始化在onViewCreated()中完成:

在Activity中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.countries_list);
    ButterKnife.bind(this);

    contentView.setOnRefreshListener(this);
    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
    listView.setAdapter(adapter);
    loadData(false);
}

在Fragment中:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ButterKnife.bind(this, view);

    contentView.setOnRefreshListener(this);

    contentView.setOnRefreshListener(this);
    adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1);
    listView.setAdapter(adapter);
    loadData(false);
}

ViewState简介

在Android开发中有一个很麻烦的问题,就是在界面被销毁、被重建的过程中保存和恢复视图状态。界面被系统回收和重建常常发生在这两个场景中:

  • Configuration变化,例如屏幕在横竖屏之间切换,语言环境变化等。
  • 界面切到后台(例如用户按Home键),Android在内存过低时自动回收此Activity,在界面重新显示时重建Activity。

思考:两种Activity被回收和重建的场景,有什么区别?

Mosby提供了一个ViewState特性来解决这一问题。ViewState是一个接口,只有一个apply方法:

public interface ViewState<V extends MvpView> {

  /**
   * Called to apply this viewstate on a given view.
   *
   * @param view The {@link MvpView}
   * @param retained true, if the components like the viewstate and the presenter have been
   * retained
   * because the {@link Fragment#setRetainInstance(boolean)} has been set to true
   */
  public void apply(V view, boolean retained);
}

例如,上面讲过的MvpLceFragment,如果想在横竖屏切换过程中保存和恢复视图状态,只需改成继承MvpLceViewStateFragment,实现如下一个方法即可:

@Override
public LceViewState<List<Country>, CountriesView> createViewState() {
    setRetainInstance(true);
    return new RetainingLceViewState<>();
}

这是针对Mosby提供的LceView的ViewState,如果是我们的自定义视图,也可以实现自己的ViewState。整个ViewState特性的实现原理和应用方法比较复杂,这里不做过多介绍。

扩展

思考

  • MVC,MVP和MVVM之间有什么区别和联系?

  • 什么是委托模式?委托和继承的区别是什么?使用委托有什么好处?

  • 什么是library?什么是framework?它们的区别是什么?

提示:library和framework的关键区别是“控制反转”(Inversion of Control)。当你调用library中的方法时,你掌握控制权。但使用framework时,控制是倒转的:由framework来调用你的代码。

  • 什么是空对象模式(Null Object Pattern)?

  • LCE视图中考虑了下拉刷新,但没有考虑上拉加载,如果服务器是分页接口,需要添加上拉加载,应该怎样定义视图接口?

  • 两种Activity被回收和重建的场景,有什么区别?

提示:参考下面两个方法:

  • Fragmemt.setRetainInstance(boolean retain)
  • Activity.onRetainNonConfigurationInstance()
mvp视频教程 该资源是本人为了学习MVP等技术报班买的,先分享给大家,希望同大家一起学习,一起进步。 立即下载

相关推荐

从零开始了解数据采集(五)——工业通信协议:数据采集的“语言”桥梁

数据采集常用的通信协议有哪一些?看完这篇你就了解了~

李恒的博客 4063

mosby mvp类库使用

//首先Gradle中引入Mvp框架 compile ‘com.hannesdorfmann.mosby:mvp:2.0.1’ compile ‘com.hannesdorfmann.mosby:viewstate:2.0.1’ **//mainActivity中** public class MainActivity extends MvpActivity<LoginView

赏金猎人 587

风控要略-互联网业务反欺诈之路(一)

当前中国互联网安全产业答题可以分为基础安全和业务安全两个领域。从互联网诞生至2014年,互联网安全行业关注的热点基本都聚焦在网络安全、系统安全和应用安全这个三大基础安全领域上,“DDOS“(分布式拒绝服务攻击)1、“漏洞“、“拖库“2和“挂马“3等大家耳熟能详的术语也是从这些领域中衍生出来的。2014年前后,随着互联网业务的爆炸式发展,黑产团伙开始从“攻击渗透系统“的传统套路进化到“利用业务风控确实进行大规模牟利“的模式,并且逐渐形成规模庞大、分工明确的黑色产业链。

Despacito1006的博客 1015

Mosby MVP使用教程

目录 1.MVP简介 2.Mosby简介 3.Hello MVP World 4.MvpPresenter的基类 5.LCE视图 6.MvpLceActivity和MvpLceFragment 7.ViewState简介 8.思考 一.MVP简介 MVP的出发点是关注点分离,将视图和业务逻辑解耦。Model-View-Presenter三个部分可以简单理解为: Mode...

Android 637

DISM错误87详解:RestoreHealth选项无法识别的修复方法

DISM(部署映像服务和管理工具)是Windows系统维护与修复的核心命令行工具,常与SFC(系统文件检查器)配合使用,用于扫描和修复组件存储损坏、系统文件缺失等问题。在执行系统健康检查时,用户常会遭遇错误87,提示“未在此上下文中识别出restorehealth选项”。该错误的本质并非工具损坏,而是命令参数结构不符合DISM的语法解析规则,或当前系统环境(如Windows 7、WinRE/PE、32位环境)不支持该参数。理解DISM的命令层级、参数挂载关系以及运行上下文,是精准排除故障的前提。通过核对标准

weixin_34116482的博客 488

人类肠道微生物群落代谢建模

MICOMWeb 是款用户友好型网站,专为人类肠道微生物群落代谢建模设计。该网站旨在解决基因组尺度代谢模型(in silico)构建过程中的3大限制:① 使用 MICOM Python 包进行通量平衡分析时对用户 Python 编程知识的要求;② 支持预定义和用户自定义饮食,以生成专属代谢模型;③ 处理宏基因组鸟枪法测序或 16S 扩增子测序获得的真实丰度数据时,所需的高通量计算基础设施。本文展示了 MICOMWeb 的核心功能,用户可轻松开展虚拟实验,为3个已发表数据集的实验验证生成功能性假设。

多组・学・多组学 1171

AI-Trader性能基准:不同AI代理在平台上的表现对比

🚀 **AI-Trader**作为100%全自动、Agent原生的交易平台,为各类AI代理提供了统一的交易环境。本文将通过详细的性能基准测试,对比不同AI代理在平台上的表现,帮助你选择最适合的代理进行交易决策。 [![AI-Trader平台架构](https://raw.gitcode.com/GitHub_Trending/aitrad/AI-Trader/raw/9a374a0ced603

gitblog_01136的博客 413

高通QNN SDK实战:从PyTorch模型到Snapdragon设备的完整部署指南

本文提供了一份详尽的高通QNN SDK实战指南,手把手教你如何将PyTorch模型高效部署到Snapdragon设备。内容涵盖从环境搭建、模型转换、量化优化到多后端部署与性能评测的完整流程,旨在帮助移动AI开发者打通模型落地的“最后一公里”,充分发挥高通平台的硬件加速潜力。

pz8901234的博客 1284

slua-unreal蓝图反射完全指南:自动化导出Unreal 4/5 API到Lua接口

slua-unreal作为Unreal Engine 4/5的专业Lua开发插件,通过Unreal自带的蓝图接口反射能力,结合libclang静态C++代码分析,实现了蓝图API到Lua接口的自动化导出。这一强大功能让开发者可以使用Lua语言高效开发游戏业务逻辑,支持热更新且无需等待C++编译,显著提升开发迭代速度。 ## 为什么选择slua-unreal蓝图反射? ### ✨ 核心优势解析

gitblog_00005的博客 496

Win10 Xbox游戏安装错误终极解决方案

Win10 Xbox游戏安装错误终极解决方案作为Windows 10系统深度用户,相信不少玩家都遇到过Xbox应用安装游戏失败的问题。这类问题轻则影响游戏体验,重则导致系统资源占用异常。本文将结合微软官方技术文档与实际维修案例,系统讲解Xbox游戏安装错误的深层原因与解决方案,帮助读者建立完整的故障处理思维体系。

mmoo_python的博客 2065

从PWM到精准电流:双光耦与LM317构建的4-20mA隔离输出方案

本文详细介绍了基于双光耦与LM317的4-20mA隔离输出方案,适用于工业自动化中的PWM信号转换。该方案通过电气隔离和精准电流调节,显著提升抗干扰能力和信号传输精度,同时降低成本60%。文章还分享了电路设计、参数计算及调试经验,为工程师提供实用参考。

weixin_32006655的博客 283

Mosby——a mode-view-presenter library for anroid_3.1.0

Github地址 使用手册 : Model-View-Presenter library for android model:获取数据模型 view:视图、数据展示 Presenter:持有view和model的引用,从model获取数据模型,通知view去更新视图 这是一个内部使用代理和组合实现的库,不是一个框架,没有框架的限制。 去掉所有三方库,三方库的维护和升级都会带来问题。 depend...

just Go! 311

嵌入式开发工程师笔试面试指南-Linux驱动

linux驱动

weixin_43491077的博客 475

使用mosby框架 应用MVP模式实现邮件客户端

本文内容结合 http://hannesdorfmann.com/android/mosby-playbook/ 前置内容 http://hannesdorfmann.com/android/mosby/ apk下载体验 https://github.com/sockeqwe/mosby/releases/download/1.1.0/sample-mail.apk 不

马克宅只是个码农 1698

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

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android Mosby MVP的使用

前言 : Android Mvp 模式是现在常用的设计模式,将视图和业务逻辑解耦,分为Model-View-Presenter三个部分。 1.M 层 为数据模型 做一些数据相关的处理 2.P 层 控制View 层 为UI 交互的发起者 接受M层的反馈 然后对 View层的控制 3.V 层 接受P层的控制改变UI 今天我们要讲的是一个MVP的一个库 Mosby 他能更好的实现MVP,让...

qq_30996881的博客 577

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【亲测免费】 Mosby:现代Android应用的MVP和MVI库

Mosby是一个专为现代Android应用设计的开源库,主要用于实现Model-View-Presenter(MVP)和Model-View-Intent(MVI)架构模式。该项目由Hannes Dorfmann开发和维护,主要使用Java语言编写,适用于Android开发者构建高效、可维护的应用程序。 ## 项目核心功能 Mosby的核心功能包括: 1. **MVP支持**:提供了一个强大...

gitblog_00182的博客 376

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android架构革命:深入理解Mosby3的MVI与MVP模式终极指南

在Android应用开发领域,**Mosby3**作为一款强大的Model-View-Presenter(MVP)和Model-View-Intent(MVI)库,正在引领Android架构设计的革命性变革。这款开源库由Hannes Dorfmann创建,旨在帮助开发者构建更加健壮、可测试和可维护的现代Android应用程序。无论你是Android开发新手还是经验丰富的架构师,掌握Mosby3都将

gitblog_00032的博客 740

Mosby-Conductor插件使用指南

Mosby-Conductor插件使用指南 项目介绍 Mosby-Conductor是一款专为Android平台设计的库,它作为Conductor控制器管理框架的一个扩展,整合了Mosby的Model-View-Presenter (MVP)和Model-View-Intent (MVI)架构模式。通过这个插件,开发者能够更轻松地在使用Conductor进行页面管理的同时,实现高效且维护性良好的M...

gitblog_00414的博客 587

MVP框架 – Ted Mosby的软件架构

我给这篇关于Android库的博客起的名字灵感来源于《老爸老妈浪漫史》中的建筑设计师Ted Mosby。这个Mosby库可以帮助大家在Android上通过Model-View-Presenter模式做出一个完善稳健、可重复使用的软件,还可以借助ViewState轻松实现屏幕翻转。 Model-View-Presenter (MVP) MVP模式是一个把view从低层模型分离出来的一种现

zyxNobita专栏 1139

Mosby3 Fragment支持:MviFragment与MvpFragment使用教程

Mosby3是一个专为现代Android应用设计的Model-View-Presenter(MVP)和Model-View-Intent(MVI)架构库,它提供了一套完整的Fragment支持方案。对于想要构建可维护、可测试Android应用的开发者来说,Mosby3的Fragment支持功能是必不可少的工具。本文将详细介绍如何快速上手使用MviFragment和MvpFragment来优化你的A

gitblog_00919的博客 819

终极Mosby3 MVP指南:构建可维护的Android应用架构

想要构建可维护、可测试且结构清晰的Android应用吗?Mosby3 MVP框架正是你需要的解决方案!🚀 作为一款专为现代Android应用设计的Model-View-Presenter库,Mosby3通过清晰的架构分层,帮助开发者告别混乱的代码,实现真正的关注点分离。无论你是Android开发新手还是经验丰富的开发者,掌握Mosby3都将大幅提升你的应用开发效率。 ## 🔍 什么是Mosb

gitblog_01051的博客 666

MVP框架 mosby

github 地址 官方文档地址 Model-View-Presenter library for android 总的来说是一个轻量级的用于android的mvp库,里面没有任何三方库(三方库需要维护成本)。 解决的是MVC模式下,activity既承担了UI工作,又承担了业务逻辑,过于臃肿的问题。 MVP模式下,Activity承担UI操作,Presenter承担业务逻辑,Model数据模型。...

just Go! 302

Mosby-Conductor插件安装与使用指南

Mosby-Conductor插件安装与使用指南 Mosby-Conductor是一个专为Conductor框架设计的插件,它将Mosby的强大MVP(Model-View-Presenter)和MVI(Model-View-Intent)架构集成到你的Android应用中,以提高代码可维护性和结构清晰性。 1. 项目目录结构及介绍 虽然具体目录结构在每个用户的实际项目中可能有所不同,但基于Mos...

gitblog_00815的博客 862

如何从Mosby2迁移到Mosby3:完整迁移指南与注意事项

还在为Android应用的架构维护而烦恼吗?Mosby3作为现代化的Model-View-Presenter和Model-View-Intent库,为你的应用开发带来了全新的体验。如果你正在使用Mosby2,现在是时候升级到Mosby3了!🚀 ## 为什么需要迁移到Mosby3? Mosby3是Android应用架构的一次重要升级,它带来了更清晰的包结构、更好的API设计和更强的扩展性。相比

gitblog_00337的博客 481
上一篇: Android一些你需要知道的布局优化技巧
下一篇: Android中如何做Monkey测试
FynnJason
博客等级 码龄10年 92粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值