MVP+Nucleus

Nucleus PLUS系统架构和组件 Nucleus PLUS系统采用软件组件的形式构成以增加系统的代码清晰性、可靠性和可重用性,使系统模块化、易于维护。Nucleus PLUS由多个软件组件构成,每个组件都有唯一的用途和特定的外部接口。每个组件的使用通过这些接口的调用实现,而组件内部的数据结构绝大多数情况下都不可以被其他组件直接访问。这种组件架构使得Nucleus PLUS的每个软件组件可以被轻松的替换和重用。本文描述了Nucleus PLUS系统部件构成。 阅读详情

今天给大家带来的是一个mvp框架,nucleus。这个框架是由国外的一位大神konmik搭建的,对mvp进行了一个封装,那么就先给大家说说MVP模式。

MVP模式

MVP是从经典的模式MVC演变而来,不同的是MVP中Model层并不会直接与View层有任何关系,而是通过Presenter来进行交互,至于MVP的好处这里我也不多陈述,网上有很多文章都对MVP的优点进行介绍,下面就先以传统的MVP给大家写一个登录的Demo感受一下。

 

MVP结构

传统MVP登录

这里是以Contract模式来分包,使用contract的好处是因为我们有一个插件,叫MVPHelper,一键生成Presenter和Model层的代码。

LoginContract

LoginActivity

首先用LoginActivity实现LoginContract.View并重写里面的方法,然后在onCreate中拿到对应Presenter层的引用,大家可以看到这里没有任何的逻辑判断,只有界面相关的操作

package cn.lxt.mvpdemo.view.activity;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import cn.lxt.mvpdemo.R;
import cn.lxt.mvpdemo.contract.LoginContract;
import cn.lxt.mvpdemo.presenter.LoginPresenter;

//首先要实现LoginContract.View
public class LoginActivity extends AppCompatActivity implements LoginContract.View, View.OnClickListener {

    private ProgressDialog mProgressDialog;
    private EditText mEtName;
    private EditText mEtPsw;
    private LoginContract.Presenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //拿到Presenter层的引用
        mPresenter = new LoginPresenter(this);
        mEtName = (EditText) findViewById(R.id.et_name);
        mEtPsw = (EditText) findViewById(R.id.et_psw);
        Button button = (Button) findViewById(R.id.btn_login);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_login:
                //点击登录
                String name = mEtName.getText().toString().trim();
                String psw = mEtPsw.getText().toString().trim();
                mPresenter.login(name, psw);
                break;
        }
    }

    //登陆成功后会走这里
    @Override
    public void loginSuccess() {
        Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
    }

     //登陆失败后会走这里
    @Override
    public void loginFailed(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showDialog() {
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setMessage("登陆中");
        mProgressDialog.show();
    }

    @Override
    public void hideDialog() {
        if (mProgressDialog != null && mProgressDialog.isShowing())
            mProgressDialog.dismiss();
    }
}

LoginPresenter

用MvpHelper这个插件一键生成该类,同样的重写方法,在构造中拿到对应Model层的引用。

package cn.lxt.mvpdemo.presenter;

import cn.lxt.mvpdemo.contract.LoginContract;
import cn.lxt.mvpdemo.model.LoginModel;
import cn.lxt.mvpdemo.view.activity.LoginActivity;

/**
 * Created by Administrator on 2017/8/17 0017.
 */
//这个类是自动生成的
public class LoginPresenter implements LoginContract.Presenter {
    private final LoginActivity loginActivity;
    private final LoginContract.Model mModel;

    public LoginPresenter(LoginActivity loginActivity) {
        this.loginActivity = loginActivity;
        mModel = new LoginModel(this);
    }

    @Override
    public void login(String name, String psw) {
        //通知view层显示dialog
        loginActivity.showDialog();
        //通知model层调用登录
        mModel.login(name, psw);
    }

    @Override
    public void loginSuccess() {
        //登陆成功之后的回调
        loginActivity.hideDialog();
        loginActivity.loginSuccess();        
    }

    @Override
    public void loginFailed(String msg) {
        //登陆失败之后的回调
        loginActivity.hideDialog();
        loginActivity.loginFailed(msg);
    }
}

LoginModel

这个类也是插件一键生成的,同样的,在构造中拿到Presenter的引用,在model层处理业务逻辑。

package cn.lxt.mvpdemo.model;

import android.text.TextUtils;

import java.util.concurrent.TimeUnit;

import cn.lxt.mvpdemo.contract.LoginContract;
import cn.lxt.mvpdemo.presenter.LoginPresenter;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;

/**
 * Created by Administrator on 2017/8/17 0017.
 */

public class LoginModel implements LoginContract.Model {
    private final LoginPresenter loginPresenter;

    public LoginModel(LoginPresenter loginPresenter) {
        this.loginPresenter = loginPresenter;
    }

    @Override
    public void login(final String name, final String psw) {
        //这里我们做逻辑处理
        if (TextUtils.isEmpty(name)) {
            loginPresenter.loginFailed("姓名不允许为空");
        } else if (TextUtils.isEmpty(psw)) {
            loginPresenter.loginFailed("密码不允许为空");
        } else {
            //这里模拟登录过程
            Observable.timer(2, TimeUnit.SECONDS)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer<Long>() {
                        @Override
                        public void accept(@NonNull Long aLong) throws Exception {
                            loginPresenter.loginSuccess();
                        }
                    });
        }
    }
}

效果很明显,view层没有任何的逻辑处理,有的只是页面的显示,presenter层只是负责view层和model层的交互,model层只是负责逻辑的处理,分工明确,当然,这只是一个最基础的MVP模式,还有很多情况没有考虑到,那么接下来给大家带来一套成熟的MVP框架,也就上面说的nucleus。

Nucleus

Nucleus 是一个实现MVP+Rxjava的框架,首先给大家说一下他的好处

  1. 它支持在View/Fragment/Activity的Bundle中保存/恢复Presenter的状态,一个Presenter可以保存它的请求参数到bundles中,以便之后重启它们
  2. 它允许一个View实例持有多个Presenter对象
  3. 快速实现View和Presenter的绑定
  4. 提供线程的基类以便复用
  5. 支持在进程重启后,自动重新发起请求,在onDestroy方法中,自动退订RxJava订阅
  6. 使用相当简单重启后台任务的方式

 

Necleus提供了3种恢复后台任务的方式,restartableFirst,restartableLatestCache,restartableReplay. 下面我们看一下它们之间“从Presenter将后台任务结果发送到View”的区别

restartableFirst只会提交第一个数据

restartableLatestCache只会提交最新的数据,而且会将它缓存起来,每当View重新Attach到Presenter的时候都会重新提交

restartableReplay提交所有的数据,每当View重新Attach到Presenter的时候都会重新提交

nucleus使用(基于rxjava,不会rxjava的小伙伴请看我之前的文章)

第一步,添加依赖

    compile 'info.android15.nucleus5:nucleus:5.0.0-beta1'
    compile 'info.android15.nucleus5:nucleus-support-v4:5.0.0-beta1'
    compile 'info.android15.nucleus5:nucleus-support-v7:5.0.0-beta1'

    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'

第二步,继承

用你项目中的BaseActivity去继承他的NucleusAppCompatActivity,比如

这样你所有继承BaseActivity的Activity就都可以使用了。

用你项目中的BaseFragment去继承他的NucleusSupportFragment

用你的BasePresenter继承他的RxPresenter

 

到此为止准备工作已经做完了。

第三步,网络请求

还是以刚才的登录为例子,不同的是这里用到了Retrofit+RxJava的模式做的联网请求,我这里用的是真实的网络请求,不是模拟的了。

首先,在LoginActivity中增加一个注解,里面的参数传入对应的Presenter类,直接上代码

package cn.lxt.nucleusdemo.view.activity;

import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import cn.lxt.nucleusdemo.R;
import cn.lxt.nucleusdemo.base.BaseActivity;
import cn.lxt.nucleusdemo.presenter.LoginPresenter;
import nucleus5.factory.RequiresPresenter;

//添加一个注解,参数为这个类所对应的Presenter
@RequiresPresenter(LoginPresenter.class)
public class LoginActivity extends BaseActivity<LoginPresenter> implements View.OnClickListener {

    private EditText mEtName;
    private EditText mEtPsw;
    private Button mButton;

    @Override
    protected void initLayout() {
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void initView() {
        mEtName = (EditText) findViewById(R.id.et_name);
        mEtPsw = (EditText) findViewById(R.id.et_psw);
        mButton = (Button) findViewById(R.id.btn_login);
    }

    @Override
    protected void initData() {
    }

    @Override
    protected void initClickListener() {
        mButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_login:
                String name = mEtName.getText().toString().trim();
                String psw = mEtPsw.getText().toString().trim();
                //注意,当你点击登录时,可以调用getPresenter()拿到对应P层的引用
                getPresenter().login(this, name, psw);
                break;
        }
    }

    public void loginSuccess() {
        Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();
    }

    public void loginFailed() {
        Toast.makeText(this, "登陆失败", Toast.LENGTH_SHORT).show();
    }
}

重头戏来了,Presenter里面的逻辑代码

还是同样的,继承你自己的BasePresenter,不同的是你可以使用nucleus帮你封装的生命周期方法了,重写onCreate方法。
在你需要调用请求的地方,调用start()方法,参数为一个int值,你可以自己定义。

package cn.lxt.nucleusdemo.presenter;

import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.Toast;

import cn.lxt.nucleusdemo.api.Service;
import cn.lxt.nucleusdemo.base.BasePresenter;
import cn.lxt.nucleusdemo.response.LoginResponse;
import cn.lxt.nucleusdemo.retrofit.RetrofitUtil;
import cn.lxt.nucleusdemo.view.activity.LoginActivity;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.BiConsumer;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import nucleus5.presenter.Factory;

/**
 * Created by Administrator on 2017/8/17 0017.
 */

public class LoginPresenter extends BasePresenter<LoginActivity> {

    private String name, psw;
    private final int REQUSET_LOGIN = 0;

    @Override
    protected void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        //调用该方法开始一个请求,第一个参数就是你start里面传入的int值,第二个参数就是一个Factory,所有的联网逻辑都写在里面,这里结合了Retrofit,第三个参数就是请求成功的回调,第四个参数就是请求失败的回调
        restartableLatestCache(REQUSET_LOGIN, new Factory<Observable<LoginResponse>>() {
            @Override
            public Observable<LoginResponse> create() {
                return RetrofitUtil.getRetrofit(context)
                        .create(Service.class)
                        .login(name, psw, "APP")
                        .subscribeOn(Schedulers.io())
                        .doOnSubscribe(new Consumer<Disposable>() {
                            @Override
                            public void accept(@NonNull Disposable disposable) throws Exception {
                                ((LoginActivity) context).showDialog();
                            }
                        })
                        .observeOn(AndroidSchedulers.mainThread());
            }
        }, new BiConsumer<LoginActivity, LoginResponse>() {
            @Override
            public void accept(LoginActivity loginActivity, LoginResponse loginResponse) throws Exception {
                loginActivity.loginSuccess();
                loginActivity.hideDialog();
                //请求成功之后调用stop(),参数为start里面传入的参数
                stop(REQUSET_LOGIN);
            }
        }, new BiConsumer<LoginActivity, Throwable>() {
            @Override
            public void accept(LoginActivity loginActivity, Throwable throwable) throws Exception {
                loginActivity.loginFailed();
                loginActivity.hideDialog();
                //请求失败之后调用stop(),参数为start里面传入的参数
                stop(REQUSET_LOGIN);
            }
        });
    }

    public void login(Context context, String name, String psw) {
        if (TextUtils.isEmpty(name)) {
            Toast.makeText(context, "用户名不能为空", Toast.LENGTH_SHORT).show();
        } else if (TextUtils.isEmpty(psw)) {
            Toast.makeText(context, "密码不能为空", Toast.LENGTH_SHORT).show();
        } else {
            this.context = context;
            this.name = name;
            this.psw = psw;
            start(REQUSET_LOGIN);
        }
    }
}

 

 

nucleus 一个开源的操作系统 一个高效的开元的嵌入式操作系统,流行了很久。 立即下载

相关推荐

Nucleus source code源代码

Nucleus源代码for S3C4510 附详细的porting guide Nucleus PLUS 是为实时要求较高的嵌入式应用设计的实时、任务抢先式、多任务内核。大 约95%的Nucleus PLUS 代码用ANSI C 编写。正因为如此,Nucleus PLUS 非常轻便并且可以很 容易的应用到大多数的微处理器家族。 Nucleus PLUS 通常作为一个 C 库文件实现。实时的Nucleus PLUS 应用被链接到Nucleus PLUS 库。目标文件可以下载到目标机,或者放到ROM 里。在一个典型的目标环境,,假设所有服务被 应用,Nucleus PLUS 指令集的二进制映象文件需要大概20K 字节的内存。 Nucleus PLUS 通常以源代码方式交货。持有Nucleus PLUS 源代码的访问权更好的促进 了理解和允许特殊应用的改动

android edittext获取内容为空,Android 记录—EditText获取文本内容为null

EditText获取文本语句:String 111=EditText.getText().toString().trim();说明:在需要获取文本信息的地方获取信息,比如你想要在Button点击事件发生后,获取文本信息,只需要在点击事件中获取。不然事先获取文本信息,需要用到的地方可能 获取不到预期的结果。比如下面的例子。错误的做法:private void initView() {Name = (...

weixin_26766559的博客 1139

实战分享:如何用Dify和MaxKb实现文档智能切分与高效检索(附代码解析)

本文详细介绍了如何结合Dify和MaxKB构建文档智能切分与高效检索系统。针对传统全文检索的不足,提出了结构感知的文档切分方案,通过解析文档层级关系并构建标题链,实现了精准的章节级检索。文章包含完整的代码实现,涵盖文档解析、智能切分、向量化策略及双索引优化,并分享了性能调优和生产环境实践经验。

qsc90123456的博客 546

android nucleus框架,Nucleus,一个好用的MVP框架

前言今天给大家带来的是一个mvp框架,nucleus。这个框架是由国外的一位大神konmik搭建的,对mvp进行了一个封装,那么就先给大家说说MVP模式。MVP模式MVP是从经典的模式MVC演变而来,不同的是MVP中Model层并不会直接与View层有任何关系,而是通过Presenter来进行交互,至于MVP的好处这里我也不多陈述,网上有很多文章都对MVP的优点进行介绍,下面就先以传统的MVP给大...

weixin_34006342的博客 407

从零构建生产级K8s-v1.35.0集群:基于Containerd与Cilium的kubeadm实战指南

本文详细介绍了从零构建生产级K8s-v1.35.0集群的全过程,涵盖环境准备、Containerd配置、Kubernetes组件安装、集群初始化及Cilium网络部署等关键步骤。通过实战经验分享系统调优技巧和常见问题解决方案,帮助读者快速搭建稳定高效的Kubernetes集群。

weixin_28725553的博客 219

U24时钟信号上升下降沿出现非单调性--简单分析

交换机U24时钟信号上升下降沿出现非单调性--简单分析

qq_45185504的博客 1131

Android MVP伴侣,Nucleus框架使用简介

Neclues是一款基于MVP框架的Android Library, 它合理地将程序中的可视化界面和后台线程联系起来。 如果你还不了解MVP框架,请点击查看详情 框架介绍 我们在应用中使用MVP和RxJava来代替Loader和AsyncTask已经有一段时间了,但即便是这些高级框架也难免会有一些缺陷: 当状态改变的时候程序很难再继续执行一个后台任务 当应用重启后程序可以恢复我们的可视化...

u013894711的专栏 1478

SAP FICO实操:如何修改已发生业务数据的成本中心公司代码(附RKACOR06程序运行指南)

本文详细解析了SAP FICO系统中使用RKACOR06程序修改已发生业务数据的成本中心和公司代码的实操方法。通过实战案例分享,提供从前期准备到后期验证的全流程指南,帮助企业应对组织架构重组或财务核算体系调整时的数据迁移挑战,特别适用于跨公司代码的成本中心划转场景。

weixin_27303545的博客 189

Nucleus对比其他MVP库:为什么选择Nucleus而非Mosby或Moxy的终极指南

在Android开发领域,选择合适的MVP(Model-View-Presenter)库对于构建健壮、可维护的应用程序至关重要。Nucleus是一个简单而强大的Android库,它专注于正确地连接后台任务与应用程序的可视化部分。本文将深入探讨Nucleus与Mosby、Moxy等其他流行MVP库的对比,帮助您做出明智的选择。😊 ## 📊 三大MVP库核心特性对比 | 特性 | Nucleu

gitblog_00060的博客 416

基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案

基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案

KE17RS的博客 2876

CATIA二次开发一一一装配体与零件之间的坐标转换

输入参数:Product(产品实例对象)、iPointToTransfor(待转换坐标点CATMathPoint)核心逻辑:通过产品对象的绝对位置变换矩阵,计算逆向变换实现坐标系转换。输出参数:Point(转换后的局部坐标点CATMathPoint)

工业软件开发 1129

如何快速上手Nucleus:10分钟构建第一个Android MVP应用

Nucleus是一个强大的Android库,它利用Model-View-Presenter(MVP)模式将后台任务与应用的视觉部分正确连接起来。本教程将帮助你在10分钟内快速上手Nucleus,构建你的第一个Android MVP应用。 ## 什么是Nucleus? Nucleus是一个轻量级的Android MVP框架,旨在简化Android应用的开发过程。它通过分离关注点,使代码更加清晰、

gitblog_00322的博客 453

【小白深度教程 1.3】使用 BP-Net 深度补全网络,进行 KITTI 稠密点云和图像融合(Depth Completion 实战)

在上一节中,我们展示了如何将从激光雷达获取的稀疏点云(深度)映射到图像。因此这篇论文我们尝试使用 Depth Completion(深度补全)技术,来将稀释的点云深度,补全为稠密深度。

2401_87064292的博客 1199

Nucleus与Dagger整合:依赖注入在MVP架构中的终极实践指南

Nucleus作为一款专注于Android平台的MVP架构库,通过Model-View-Presenter模式实现后台任务与UI组件的解耦。而Dagger作为Google官方推荐的依赖注入框架,能够有效简化对象创建和依赖管理流程。本文将详细介绍如何将这两者完美整合,打造清晰、可维护的Android应用架构。 ## 为什么选择Nucleus+Dagger组合? 在Android开发中,MVP架构

gitblog_00580的博客 1042

第1章 大数据概述

三次信息化浪潮 信息化浪潮 发生时间 标志 解决的问题 代表企业 第一次 1980年前后 个人计算机 信息处理 Intel、AMD、IBM、苹果、微软、联想、戴尔、惠普等 第二次 1995年前后 互联网 信息传输

wyz191的专栏 7088

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Nucleus架构设计解析:为什么它比传统MVP更适合Android开发

在Android应用开发中,**Nucleus**作为一个创新的Model-View-Presenter(MVP)架构库,通过其独特的设计解决了传统MVP模式在生命周期管理和后台任务处理方面的核心痛点。本文将深入解析Nucleus的架构设计,揭示它如何成为Android开发中更优秀的MVP解决方案。 ## 🔍 Nucleus解决的核心问题 传统Android开发中,开发者经常面临两个棘手的问

gitblog_07513的博客 336

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

如何快速实现Nucleus与Fragment集成:Android MVP支持库的完整使用教程

Nucleus是一个强大的Android库,专门用于实现Model-View-Presenter(MVP)架构模式,特别擅长处理后台任务与UI界面的连接问题。对于Android开发者来说,Fragment与Nucleus的集成是实现现代化应用架构的关键一步,本教程将详细介绍Nucleus支持库与Fragment的完整集成方法。😊 ## 📱 Nucleus与Fragment集成的核心优势 N

gitblog_01087的博客 460

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Nucleus迁移指南:从AsyncTask和Loader平滑过渡到MVP架构的终极解决方案

在Android开发中,处理后台任务与UI的同步一直是个挑战。传统的AsyncTask和Loader虽然简单易用,但在配置变更和进程重启时经常出现问题。Nucleus是一个专业的Android库,它采用Model-View-Presenter(MVP)模式,为开发者提供了从传统后台任务处理到现代架构的平滑迁移路径。这个终极解决方案能帮助您解决配置变更和进程重启时的任务恢复问题,让应用更加稳定可靠。

gitblog_00562的博客 315

使用MVP+Retrofit+RxJava实现的的Android Demo (上)使用Nuclues库实现MVP

最近写了一个 Android 小 Demo,使用基于Nucleus库的MVP框架进行代码分割,并Retrofit和RxJava进行数据请求和处理,下面通过Demo代码分享下这几种技术的使用方法。需求从网络Api获取Json格式的笑话数据,通过列表方式显示,列表分页显示,当上拉到最后一个数据是,自动从网络加载数据并显示,在顶端进行下拉式刷新数据。最终效果图: App下载地址: http://a.

持续学习 2497

Github标星5-8K今年最热门技术-Android-MVP-阿里大牛-倾情-详解(上)

2014年年底偶然得知在Android开发中出现了MVP这种模式,当时觉得这东西挺好,正好赶上公司要做一个新的小项目,于是尝试了一下。仿照网上的Demo分出View、Model、Presenter层,抽取View接口,看起来像那么回事的用MVP完成了整个项目。因为项目简单,期间也没有遇到什么坑,但是总觉得还有那些地方不对。

2401_84412961的博客 846

MVP在Android平台上的应用

Android平台上MVP的介绍 这篇文章向你介绍Android平台上的MVP模式,从一个简浅的例子开始实践之路。文章也会介绍一个一个库让你在Android平台上轻松的实现MVP 简单吗?我怎么才能从中受益? 什么是MVP? View 层主要是用于展示数据并对用户行为做出反馈。在Android平台上,他可以对应为Activity, Fragment,View或者对话框。Mo

我的博客 628

PI-Desktop 全平台安装指南:macOS、Windows、Linux 三系统 10 分钟部署清单

PI-Desktop 是一个本地优先的 AI 编程 Agent 桌面客户端,基于 Electron 与 Rust host core 构建。本文带你完成 macOS、Windows、Linux 三大系统的下载安装与首次配置,全程约 10 分钟,即可跑通第一个 AI 编程任务。 - 📍 **本地优先**:项目与会话留在本机,API 凭据存入操作系统钥匙串,无需注册账号、无强制云端中转 - 🧠

gitblog_00633的博客 622

撸一撸MVP吧

吹吹水最近刚刚上班,几天连续加班,做重构,满心激情,像打了鸡血一样。连续几天没去健身了,心里痒痒的,今天果断不加班,回来去健身。回到家里看着有些时间,这几天做的东西也有点心得,赶紧写写东西记录一下。背景首先,项目重构撸了两三天的网络部分,采用的Retrofit+RxJava,这部分后面打算搞个时间再说,然后想到整体架构的时候,我决定采用MVP模式,观摩了google的MVP-TODO项目。比较贱的是

wangjianfengnb 19万+

Cangjie 标准库 std.net 网络编程完全指南:UDP/TCP/UDS 三种 Socket 与 IP 地址体系详解

`std.net` 是 Cangjie 语言标准库中负责网络通信的核心包,它提供了启动 `Socket` 服务器、连接远端服务器、发送与接收数据等完整能力,并配套了 `IP` 地址、`IP` 前缀(子网)、`Socket` 地址等基础数据结构。本文以 [std.net 包概览](https://link.gitcode.com/i/ed4116774cccd14ecffd8af3059ece67)

gitblog_00990的博客 619

android MVP

原文链接 : Introduction to Model-View-Presenter on Android原文作者 : konmik译文出自 : 其他 http://konmik.github.io/introduction-to-model-view-presenter-on-android.html译者 : MiJack校对者: MiJack状态 : 校对完成 ======

yangxuehui1990的专栏 380

MVP

MVP

qq_21198501的博客 319
上一篇: Android中的常用框架——IcePick
下一篇: 极光推送集成厂商通道指南
code_dream_wq
博客等级 码龄10年 51粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值