动态代理实现mvp

冒险岛脚本函数大全:cm.sendYesNo和cm.warp的20个实战用法 本文深入解析了冒险岛脚本中cm.sendYesNo和cm.warp两个核心函数的20个实战应用场景。从基础的确认对话框交互、条件判断,到复杂的装备强化系统、动态传送与副本入口逻辑,文章通过大量代码示例展示了如何组合运用这两个函数,实现从简单NPC到复杂任务系统的进阶脚本开发,并分享了状态管理、错误处理与性能优化等最佳实践。 阅读详情

就不说啥是mvp了,也不说啥是静态代理动态代理了,直接撸代码吧~

一、创造轮子
1.定义View父类接口
public interface BaseView
{
}
2.定义父类Presenter,持有V的引用
public class BasePresenter<V extends BaseView>
{
    private static final String TAG = "BasePresenter";
    private V baseView;

    public void onBindView(V view)
    {
        this.baseView = view;
    }

    public void onUnbindView()
    {
        this.baseView = null;
    }

    public void onDestroyPersenter()
    {
        Log.e(TAG, "-------> onDestroyPersenter");
    }

    public void onSaveInstanceState(Bundle outState)
    {
        Log.e(TAG, "-------> onSaveInstanceState");
    }

    public V getView()
    {
        return baseView;
    }
}
3.定义允许子类继承父类的注解
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface CreatePresenter
{
    Class<? extends BasePresenter> value();
}
4.创建操作Presenter接口
public interface IPresenterFactory<V extends BaseView, P extends BasePresenter<V>>
{
    /**
     * 创建Presenter
     */
    P createPresenter();
}
5.对接口IPresenterFactory的实现
public class PresenterFactory<V extends BaseView, P extends BasePresenter<V>> implements IPresenterFactory<V, P>
{
    /**
     * 需要创建的Presenter的类型
     */
    private final Class<P> mPresenterClass;

    public PresenterFactory(Class<P> presenterclass)
    {
        this.mPresenterClass = presenterclass;
    }

    public static <V extends BaseView, P extends BasePresenter<V>> PresenterFactory<V, P> createFactory(Class<?> viewClazz)
    {
        CreatePresenter annotation = viewClazz.getAnnotation(CreatePresenter.class);
        Class<P> aClass = null;
        if (null != annotation)
        {
            aClass = (Class<P>) annotation.value();
        }
        return aClass == null ? null : new PresenterFactory<V, P>(aClass);
    }

    @Override
    public P createPresenter()
    {
        try
        {
            return mPresenterClass.newInstance();
        }
        catch (Exception e)
        {
            throw new RuntimeException("Presenter create failed!");
        }
    }
}
6.创建代理Presenter接口,持有对IPresenterFactory的引用
public interface IPresenterProxy<V extends BaseView, P extends BasePresenter<V>>
{
    /**
     * 设置创建Presenter的工厂
     */
    void setPresenterFactory(IPresenterFactory<V, P> presenterFactory);

    /**
     * 获取Presenter的工厂类
     */
    IPresenterFactory<V, P> getPresenterFactory();

    /**
     * 获取创建的Presenter
     */
    P getPresenter();
}
7.对接口IPresenterProxy的实现
public class PresenterProxy<V extends BaseView, P extends BasePresenter<V>> implements IPresenterProxy<V, P>
{
    /**
     * 获取onSaveInstanceState中bundle的key
     */
    private static final String PRESENTER_KEY = "presenter_key";

    /**
     * Presenter工厂类
     */
    private IPresenterFactory<V, P> mFactory;
    private P mPresenter;
    private Bundle mBundle;
    private boolean mIsBindView;

    public PresenterProxy(IPresenterFactory<V, P> mFactory)
    {
        this.mFactory = mFactory;
    }

    /**
     * 设置Presenter的工厂类,这个方法只能在创建Presenter之前调用,也就是调用getPresenter()之前,如果Presenter已经创建则不能再修改
     * @param presenterfactory IWanPresenterFactory类型
     */
    @Override
    public void setPresenterFactory(IPresenterFactory<V, P> presenterfactory)
    {
        if (null != mPresenter)
        {
            throw new IllegalArgumentException("setPresenterFactory() can only be called before getPresenter() be called");
        }
        this.mFactory = presenterfactory;
    }

    /**
     * 获取Presenter工厂类
     * @return
     */
    @Override
    public IPresenterFactory<V, P> getPresenterFactory()
    {
        return mFactory;
    }

    @Override
    public P getPresenter()
    {
        if (null != mFactory)
        {
            if (null == mPresenter)
            {
                mPresenter = mFactory.createPresenter();
            }
        }
        return mPresenter;
    }

    /**
     * 绑定Presenter和view
     * @param mvpView
     */
    public void onCreate(V mvpView)
    {
        getPresenter();
        if (null != mPresenter && !mIsBindView && null != mvpView)
        {
            mPresenter.onBindView(mvpView);
            mIsBindView = true;
        }
    }

    /**
     * 销毁Presenter持有的View
     */
    private void onUnbindView()
    {
        if (null != mPresenter && mIsBindView)
        {
            mPresenter.onUnbindView();
            mIsBindView = false;
        }
    }

    /**
     * 销毁Presenter
     */
    public void onDestroy()
    {
        if (null != mPresenter)
        {
            onUnbindView();
            mPresenter.onDestroyPersenter();
            mPresenter = null;
        }
    }

    /**
     * 意外销毁的时候调用
     * @return Bundle,存入回调给Presenter的Bundle和当前Presenter的id
     */
    public Bundle onSaveInstanceState()
    {
        Bundle bundle = new Bundle();
        getPresenter();
        if (null != mPresenter)
        {
            Bundle presenterBundle = new Bundle();
            // 回调Presenter
            mPresenter.onSaveInstanceState(presenterBundle);
            bundle.putBundle(PRESENTER_KEY, presenterBundle);
        }
        return bundle;
    }

    /**
     * 意外关闭恢复Presenter
     * @param savedInstanceState 意外关闭时存储的Bundler
     */
    public void onRestoreInstanceState(Bundle savedInstanceState)
    {
        mBundle = savedInstanceState;
    }
}
8.创建BaseMvpActivity
public abstract class BaseMvpActivity<V extends BaseView, P extends BasePresenter<V>> extends RxAppCompatActivity implements IPresenterProxy<V, P>
{
    private static final String PRESENTER_SAVE_KEY = "presenter_save_key";

    /**
     * 创建被代理对象,传入默认Presenter的工厂
     */
    private PresenterProxy<V, P> mProxy = new PresenterProxy<>(PresenterFactory.<V, P>createFactory(getClass()));
    protected Activity activity;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        if (0 != getContentId())
        {
            setContentView(getContentId());
        }
        activity = this;
        if (null != savedInstanceState)
        {
            mProxy.onRestoreInstanceState(savedInstanceState.getBundle(PRESENTER_SAVE_KEY));
        }
        mProxy.onCreate((V) this);
        initView();
        initData(savedInstanceState);
    }

    @Override
    public void setPresenterFactory(IPresenterFactory<V, P> presenterfactory)
    {
        mProxy.setPresenterFactory(presenterfactory);
    }

    @Override
    public IPresenterFactory<V, P> getPresenterFactory()
    {
        return mProxy.getPresenterFactory();
    }

    @Override
    public P getPresenter()
    {
        return mProxy.getPresenter();
    }

    /**
     * 获取Layout布局
     *
     * @return
     */
    public abstract int getContentId();

    /**
     * 初始化布局资源
     */
    public abstract void initView();

    /**
     * 初始化数据
     *
     * @param savedInstanceState
     */
    public abstract void initData(Bundle savedInstanceState);

    /**
     * @param outState
     */
    @Override
    protected void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);
        outState.putBundle(PRESENTER_SAVE_KEY, mProxy.onSaveInstanceState());
    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        mProxy.onDestroy();
    }
}

9.创建BaseMvpFragment
public abstract class BaseMvpFragment<V extends BaseView, P extends BasePresenter<V>> extends RxFragment implements IPresenterProxy<V, P>
{
    private static final String TAG = "BaseMvpFragment";
    private static final String PRESENTER_SAVE_KEY_FRAGMENT = "presenter_save_key_fragment";
    /**
     * 创建被代理对象,传入默认Presenter的工厂
     */
    private PresenterProxy<V, P> mProxy = new PresenterProxy<>(PresenterFactory.<V, P>createFactory(getClass()));
    private View view;
    /**
     * Fragment的View加载完毕的标记
     */
    private boolean isViewCreated;
    /**
     * Fragment对用户可见的标记
     */
    private boolean isDataLoaded;

    @android.support.annotation.Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @android.support.annotation.Nullable ViewGroup container, @android.support.annotation.Nullable Bundle savedInstanceState)
    {
        view = inflater.inflate(getViewLayoutId(), container, false);
        mProxy.onCreate((V) this);
        initView(view);
        Log.e(TAG, "-------> onCreateView");
        return view;
    }

    @Override
    public void onActivityCreated(@android.support.annotation.Nullable Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        isViewCreated = true;
        prepareRequestData();
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser)
    {
        super.setUserVisibleHint(isVisibleToUser);
        prepareRequestData();
        Log.e(TAG, "----@---> setUserVisibleHint");
    }

    public boolean prepareRequestData()
    {
        return prepareRequestData(false);
    }

    public boolean prepareRequestData(boolean forceUpdate)
    {
        if (getUserVisibleHint() && isViewCreated && (!isDataLoaded || forceUpdate))
        {
            initData();
            isDataLoaded = true;
            return true;
        }
        return false;
    }

    /**
     * 布局
     * @return
     */
    public abstract int getViewLayoutId();

    /**
     * 初始化布局资源
     * @return
     */
    public abstract void initView(View view);

    /**
     * 初始化数据
     * @return
     */
    public abstract void initData();

    @Override
    public void onResume()
    {
        super.onResume();
    }

    @Override
    public void onAttach(Context context)
    {
        super.onAttach(context);
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        mProxy.onDestroy();
        Log.e(TAG, "-------> onDestroy");
    }

    @Override
    public void onDestroyView()
    {
        super.onDestroyView();
        Log.e(TAG, "-------> onDestroyView");
    }

    @Override
    public void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);
        outState.putBundle(PRESENTER_SAVE_KEY_FRAGMENT, mProxy.onSaveInstanceState());
    }

    @Override
    public void setPresenterFactory(IPresenterFactory<V, P> presenterfactory)
    {
        mProxy.setPresenterFactory(presenterfactory);
    }

    @Override
    public IPresenterFactory<V, P> getPresenterFactory()
    {
        return mProxy.getPresenterFactory();
    }

    @Override
    public P getPresenter()
    {
        return mProxy.getPresenter();
    }
}
二、使用轮子
1.创建登录View
public interface LoginView extends BaseView
{
    // 获取用户名
    String getUserName();
    // 获取用户密码
    String getPasswd();

    // 登录成功时的回调
    void loginSuccess();
    // 登录失败时的回调
    void loginFailed(String errCode, String errMsg);
}
2.创建登录Presenter
public class LoginPresenter extends BasePresenter<LoginView>
{
    /**
     * 登录
     */
    public void login()
    {
        // 获取用户名和密码
        String userName = getView().getUserName();
        String passwd = getView().getPasswd();

        // 进行网络请求...

        // 网络请求登录失败时:
        // 网络请求登录失败的errCode及errMsg
        String errCode = "-5001";
        String errMsg = "用户名密码错误!";
        getView().loginFailed(errCode, errMsg);

        // 网络请求登录成功时:
        getView().loginSuccess();
    }
}
3.创建登录Activity页面
@CreatePresenter(LoginPresenter.class)
public class LoginActivity extends BaseMvpActivity<LoginView, LoginPresenter> implements LoginView
{
    private EditText user_name;
    private EditText user_password;
    private Button btn_login;

    @Override
    public int getContentId()
    {
        return R.layout.activity_login_layout;
    }

    @Override
    public void initView()
    {
        user_name = this.findViewById(R.id.user_name);
        user_password = this.findViewById(R.id.user_password);
        btn_login = this.findViewById(R.id.btn_login);
    }

    @Override
    public void initData(Bundle savedInstanceState)
    {
        btn_login.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (TextUtils.isEmpty(getUserName()))
                {
                    ToastUtil.showToast("用户名不能为空!");
                    return;
                }
                if (TextUtils.isEmpty(getPasswd()))
                {
                    ToastUtil.showToast("密码不能为空!");
                    return;
                }
                ARouter.getInstance().build(ARouterUtil.MAINACTIVITY).navigation();
                finish();
            }
        });
    }

    @Override
    public String getUserName()
    {
        return user_name.getText().toString().trim();
    }

    @Override
    public String getPasswd()
    {
        return user_password.getText().toString().trim();
    }

    @Override
    public void loginSuccess()
    {
        // 执行页面跳转
    }

    @Override
    public void loginFailed(String errCode, String errMsg)
    {
        // 打印errCode和errMsg
    }
}
BaseMvpFragment与BaseMvpActivity使用方法相同,就不写使用方法了!
FreeSurfer预处理命令 比如将/source/kernel.tgz解压到 /source/linux-2.6.29 目录 tar zxvf /source/kernel.tgz -C /source/ linux-2.6.29 tar zxvf /home/tj/application/freesurfer/subjects/mindboggle/OASIS-TRT-20-1.tar.gz -C /home/tj/application/freesurfer/subjects (1)lh.thickness mri_surf2su 阅读详情

相关推荐

SAP 零售 FMS 物料主数据(一)

SAP 零售 FMS 物料主数据(一) SAP 对于鞋服行业最新的解决方案-FMS(相当于原来的AFS+Retail);更偏向与零售; 商品主数据与原来的AFS大不相同,取消了原来的Grid的网格概念,取而代之的是变式;商品主数据维护也偏向于Retail的维护模式;事物代码也不是MM01而是MM41 /MM46; 在维护商品主数据前,需要与商品部沟通定义各种商品相关的规范如编码规则,大中小类 ,颜色库,尺码库等,此处不赘述; 创建商品需要确定哪些物料是变式物料,哪些是常规不带特性的单一物料;这决定了在创建商

weixin_45518759的博客 5061

动态代理在MVP中的使用

动态代理

zhaonhui的博客 538

手把手教你用vivado2018.3为复旦微JFMQL15T打IP补丁(含环境变量配置技巧)

本文详细介绍了在Vivado 2018.3环境中为复旦微JFMQL15T开发板打IP补丁的全流程,包括环境变量配置、IP缓存管理等关键步骤。通过实战验证的解决方案,帮助工程师快速搭建开发环境,解决国产芯片开发中的常见问题,提升开发效率。

weixin_30374009的博客 725

iOS的MVP设计模式

iOS的MVP设计模式

u013712343的博客 1002

R语言dplyr包recode函数、recode_factor函数数值或因子替换实战

R语言dplyr包recode函数、recode_factor函数数值或因子替换实战 目录 R语言dplyr包recode函数、recode_factor函数数值或因子替换实战 #导入dplyr包 #recode函数进行数值替换 #recode_factor函数对因子变量进行替换 #导入dplyr包 install.packages("dplyr") # Install & load dplyr library("dpl.

data+scenario+science+insight 1590

【OCPP】ocpp1.6协议3.3章节:功能配置文件及接口

Smart Charging Profile中定义了4个接口请求,即GetCompositeSchedule、ClearChargingProfile、SetChargingProfile和ClearCache等。Smart Charging: 包含智能充电相关的功能,如计划充电,报告充电计划,并改变充电速度。Core: 包含电动汽车充电相关的基础功能,如启动和停止充电,更改充电配置,报告充电状态等。Reservation: 包含预约服务相关的功能,如创建,取消和更改预约。

qq_53871375的博客 2170

今天我才学会iOS的MVP写法

目前写 iOS 程序差不多整整两年了,期间断断续续写过 3 个 iOS 项目。之前写 android 的时候使用了 MVP 架构,但是写 iOS 的时候一直没有找到好的 MVP 实践,所以之前项目的所有代码都是堆在 ViewController 中。虽然使用了较多的注释和#MARK 使得代码不那么凌乱,但是动辄几百甚至上千行的 ViewController 还是让人很抓狂。 直到昨天我开始写下一个...

weixin_34080571的博客 228

<PLC><工控>汇川Easy521PLC与压力传感器485通讯实例

有些PLC在进行串口通讯时,配置完串口参数后,还需要自己编程序来读写,但本例中汇川Easy521配置完成后,想要读取从站什么数据,只需要在“COM0 Modbus配置窗口”配置即可。可以同时配置多个从站。在配置窗口的右侧点击新增按钮,就会自动生成一条从站的配置,默认从站站号为“1”,触发方式是“循环”,功能码是03(读寄存器),从站寄存器地址为0,长度为“1”,映射地址需要自己添加。因为我们是将PLC设置为Modbus主站,所以压力传感器就是从站,我们的需求时PLC从这些从站传感器中读取数据,比如压力值。

用沸腾的热血,支付我们的人生吧! 6458

iOS-MVP模式

前言 最近一段时间,公司刚做完一个MVP项目,我有一个习惯:在项目结项之后总结一下项目中新接触的问题。Google一下关键字“iOS MVP”,发现一些文章,最后是 这篇文章 带给我对MVP 的一些认识。MVP似乎有好多的变种,作者所说的这种有如下特点(以下是原文摘抄一段): The characteristics of this variant are: * the view part of the MVP consists of both UIViews and UIViewCon.

MinggeQingchun的博客 395

SOME/IP协议详解「1.0·概述」

主要讲解什么是someip,

雪云飞星的博客 5367

【100%通过率】华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】

2023华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位

MISAYAONE的博客 587

【Swift实现代码】iOS架构模式之MVP

1.什么是MVP? MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。  1.1 模型 (Model):负责处理数据的加载或存储 1.2 视图 (View):负责界面数据的展示与用户交互 1.3 主持人(Presenter):是Model和View之间的桥梁,将两者进行链接。 整个交互流程看起来大致是这样的: ...

weixin_33725126的博客 262

科研项目数据抓取:Python爬虫实现与分析

本文详细介绍了如何使用Python爬虫抓取科研项目的数据,涵盖了从目标数据源选择到数据存储与分析的整个过程。通过使用。

2201_76125261的博客 1710

浅谈Android中的MVP与动态代理的结合

浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右。从最开始到现在经历的几个项目中我都采用了MVP架构作为底层框架,使得在view(Activity/Fragment)层中的业务调用逻辑分离到另外的presenter层中,让view层变得非常的轻量,并且不会出...

Jimmy's Blog 4112

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

动态代理MVP架构搭建

MVP架构搭建简介动手搭建1. base基类的搭建 简介 mvp的全称为Model-View-Presenter,Model数据层,View视图层, Presenter逻辑层。MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据 动手搭建 1. base基类的搭建 (1)BaseView view接口 (2)B

weixin_43607099的博客 288

pscad IEEE标准系统搭建说明

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

MVP相关文章以及Demo

相关文章: 搭建属于自己的Android MVP 框架(文章讲解详细,涉及contract,有demo) Android MVP架构从入门到精通-真枪实弹

songzi1228的博客 278

Android MVP-编程思想4(AOP思想-动态代理运用,反射创建M层实例对象)

上一节讲解了如何处理内存泄露,如何做基类封装。这一节学习如何使用动态代理处理重复逻辑。 在第二小节中我们已经提到了下面的问题:网络请求是耗时操作,我们 Presenter 层持有了 View 层的引用,也就是 Activity 的引用,在网络请求过程中,Activity被用户或者系统关闭,这时 View 相当于被摧毁了,如果不进行判断 View 引用是否为空,当数据返回时,就会造成空指针异常,所以...

程序员 465

java动态代理浅析

每次使用动态代理都会先查一下怎么用,这次想通过一个demo加深一下印象,所以有了这篇文章。 在梳理过程中,我的总结如下: · 被动态代理的对象必须实现接口 · 动态代理能调用的方法都是被代理对象的实现接口方法 各位看官觉得有问题可以在评论区留言 创建接口类 这里我们创建了如下两个接口类 public interface IBeProxyMod1 { void showLog1(); void showLog2(int code); } public interface IBeProxyMo

小小9575的博客 291

Retrofit源码分析以及MVP框架封装使用

阅读此文前请先阅读Retrofit+okhttp网络框架介绍 从上文中我们已经了解通过如下代码即可得到返回给我们call 以及 response对象,今天我们通过源码来分析这个过程是如何实现的。 /** * 获取天气数据 * @param cityname * @param key * @return */ @GET("/weather/in

JackWaiting 6885

Android MVP Base类的封装,内存泄漏,代理,多presenter,注解依赖等封装(2)

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。同时我还搜集整理2020年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含。,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含。

2301_82241775的博客 406

Retrofit实践(MVP+RxJava)

Retorfit实践(MVP+RxJava)之前两篇文章分别介绍了 MVP 以及 RxJava,今天我们通过学习Retrofit来进一步介绍他们。文章目录如下:Retorfit实践MVPRxJava Retorfit介绍 Retorfit实践 添加依赖 Model层 定义请求接口 创建 Retrofit对象 View层 Presenter层Retorfit介绍Retrofit(GitHub)与okh

S.H.的部落格林 1015

MVP学习笔记

mvp基本架构思想 业务层 数据层 表现层 基本思想就是实现解耦,以动态代理,注入实现类,从表现层即原本的MVC中的C进行对业务层逻辑初始化,将自身C传递到逻辑层,逻辑层经过一系列的数据层进行数据处理后,调用C层提供的接口返回到C层对业务进行更新.直接图解C层解耦可以通过对C层创建一个专属的代理操作的接口类,由业务逻辑层获得这个对象M层解耦以同样的方式将M层操作注入到业务层小结解耦交给P层进行处理,

看!有只程序猿! 289

开发模式 MVP - 基础框架搭建和分析

这期来看下 MVP ,如果不是很了解 MVP 是啥?请自行补一补基础知识,我其实也不太会,如果 RxJava 、OkHttp 、Retrofit 的运用和源码不是特别熟悉,也请去我之前的一些文章补一补,我其实也不太会。我们先来写一个简单版代码,然后分析其问题,运用之前的一些设计模式基础来一个一个解决。拿获取个人用户资料信息为例:1.简单基础版本UserInfoContract 类/** * des

z240336124的专栏 604

代理模式及应用

代理模式 定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 优点: 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用; 代理对象可以扩展目标对象的功能; 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度; 缺点: 在客户端和目标对象之间增加一个代...

JALLV的博客 627

Android之电商Demo模块

本次实现的就是 登录注册,商品列表 ,商品详情 购物车,以及视频ijkplayer的简单实用:   先来看登录注册 : 这里用的网络请求是:Retorfit+Rxjava Mvp的模式   bean类就不用说了 大多都是自动生成的   因为整个模块都是mvp架构和Retorfit+Rxjava组成的所以简单做了个基类,减少代码的复用 Retrofit:的工具类 主要实现:

Song_dn的博客 1588

MVP 模式中解决 NPE 问题

网上搜集到三篇文章 https://www.jianshu.com/p/a46d22fe9928 https://medium.com/@trionkidnapper/android-mvp-an-end-to-if-view-null-42bb6262a5d1 https://blog.youkuaiyun.com/qq137722697/article/details/78275882 前两篇是用动态代...

PowerMartin Talk 267

2019年海康威视Android校招

一面(十五分钟技术面+五分钟hr面):面试官问了十分钟个人项目,由于项目中使用了Retrofit和MVP架构,于是问了我MVP的好处及缺点(缺点是代码量多,没答上来噗)。接下来问了Retrofit2的原理和Retrofit使用到的设计模式,我老实回答看过Retrofit源码,里面主要是Java的动态代理,设计模式我用过观察者模式和单例模式,Retrofit2不知道,应该用了观察者模式,因为里面那个...

DeerBigRed的博客 835
上一篇: 将返回的ResponseBody转为实体类
下一篇: Android Studio 可以正常编译但是代码爆红解决方法
「已注销」
博客等级 码龄12年 5粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值