Neclues是一款基于MVP框架的Android Library, 它合理地将程序中的可视化界面和后台线程联系起来。

如果你还不了解MVP框架,请点击查看详情

框架介绍

我们在应用中使用MVP和RxJava来代替Loader和AsyncTask已经有一段时间了,但即便是这些高级框架也难免会有一些缺陷:

  • 当状态改变的时候程序很难再继续执行一个后台任务
  • 当应用重启后程序可以恢复我们的可视化界面,但是对于后台任务却难以继续执行

当大多数程序都不具备该功能的时候,这种缺陷看起来更像是一个bug。当我们乘坐地铁上操作手机的时候由于网络太慢而切换到另外一个程序,这时候由于程序状态的改变可能会引起一些bug,但是大多数开发者都没有考虑到。

安卓开发文档对此类问题描述的非常详细,详情请查看Processes and Threads - 4. Background process :“如果我们正确的重写了activity的生命周期方法,并保存了当前的状态,那么当用户杀掉进程的时候不会对用户体验造成不好的影响,因为当用户再次打开应用程序后activity会恢复它的可视化状态”。

然而,以上所说并非正确,因为程序被kill的时候我们并没有保存后台任务,程序会记得他被杀死的时候界面是什么样子,但是不会记得它当时在做什么,从而会对用户体验造成影响。例如:一个程序在恢复了一个ProgressBar View,但是没有恢复它的后台任务,这时候我们就会看到一个“ProgressBar Forever” bug。

Neclues的特点

  • Neclues自动地将view和后台任务绑定在一起,即便是在状态恢复的时候程序也不会忘记View和View绑定的任务状态
  • 程序即便是在低内存设备上运行或长久地停留在后台,Neclues也能将后台任务正确地唤醒
  • Neclues框架遵循了The Kiss Principle原则,人人都能轻易地理解
  • Neclues不依赖于Dagger,你不需要为了注入Presenter而重写一个类
  • Presenter在Neclues中是一个不依赖于View的外部类,这可以自动屏蔽activity内存泄漏的问题

历史演变

在第一个版本中,Neclues主要是为了尽可能地简化MVP的实现

过了几个月后,作则开始意思到RxJava已经变成了执行后台任务的首选框架,所以RxPresenter诞生了。从那以后,框架目的变成了对RxJava的支持

作者一开始对于生命周期的正确处理是非常明确的,所以在文档中没有着重强调。随着越来越多的MVP框架出现,Necleus需要区分与它们的不同,所以框架的描述变成了:“Neclues是一款基于MVP框架的Android Library, 它合理地将程序中的可视化界面和后台线程联系起来”

重启后台任务的方式

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

restartableFirst只会提交第一个数据

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

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

基础样例

这个例子是在Presenter创建的时候从网络上获取数据

public class MainPresenter extends RxPresenter<MainActivity> {private static final int REQUEST_ITEMS = 1;@Overrideprotected void onCreate(Bundle savedState) {super.onCreate(savedState);restartableLatestCache(REQUEST_ITEMS,() -> App.getServerAPI().getItems().observeOn(AndroidSchedulers.mainThread()),(activity, response) -> activity.onItems(response.items),(activity, throwable) -> activity.onItemsError(throwable));// After a process restart, it will restart itself when registering the restartableif (savedState == null)start(REQUEST_ITEMS);}}

从View中获取参数

我们在MVP框架中使用网络请求的时候可能会在View中获取一些参数,在Necleus中你只需要调用getPresenter().request("my_parameter");

public class MainPresenter extends RxPresenter<MainActivity> {private static final int REQUEST_ITEMS = 1;private static final String NAME_KEY = MainPresenter.class.getName() + "#name";private String name;@Overrideprotected void onCreate(Bundle savedState) {super.onCreate(savedState);// Recover the value after a process restart, you have to restore it before// registering the restartable, or you will get a NullPointerExceptionif (savedState != null)name = savedState.getString(NAME_KEY);restartableLatestCache(REQUEST_ITEMS,() -> App.getServerAPI().getItems(name).observeOn(AndroidSchedulers.mainThread()),(activity, response) -> activity.onItems(response.items),(activity, throwable) -> activity.onItemsError(throwable));}@Overrideprotected void onSave(@NonNull Bundle state) {super.onSave(state);state.putString(NAME_KEY, name);}public void request(String name) {this.name = name;start(REQUEST_ITEMS);}
}

Neclues中Activity的使用

public class MainPresenter extends RxPresenter<MainActivity> {private static final int REQUEST_ITEMS = 1;private static final String NAME_KEY = MainPresenter.class.getName() + "#name";private String name;@Overrideprotected void onCreate(Bundle savedState) {super.onCreate(savedState);// Recover the value after a process restart, you have to restore it before// registering the restartable, or you will get a NullPointerExceptionif (savedState != null)name = savedState.getString(NAME_KEY);restartableLatestCache(REQUEST_ITEMS,() -> App.getServerAPI().getItems(name).observeOn(AndroidSchedulers.mainThread()),(activity, response) -> activity.onItems(response.items),(activity, throwable) -> activity.onItemsError(throwable));}@Overrideprotected void onSave(@NonNull Bundle state) {super.onSave(state);state.putString(NAME_KEY, name);}public void request(String name) {this.name = name;start(REQUEST_ITEMS);}
}

从View中发送数据(此处用到了IcePick)

为了避免每次都手动调用save/restore instance,你可以在应用中使用IcePick,并创建BasePresenter

public class BasePresenter<V extends ViewWithPresenter> extends RxPresenter<V> {@Overrideprotected void onCreate(Bundle savedState) {super.onCreate(savedState);Icepick.restoreInstanceState(this, savedState);}@Overrideprotected void onSave(@NonNull Bundle state) {super.onSave(state);Icepick.saveInstanceState(this, state);}}

如果你的Presenter继承了BasePresenter,那么应该长这样

import icepick.State;public class MainPresenter extends BasePresenter<MainActivity> {private static final int REQUEST_ITEMS = 1;@State String name;@Overrideprotected void onCreate(Bundle savedState) {super.onCreate(savedState);restartableLatestCache(REQUEST_ITEMS,() -> App.getServerAPI().getItems(name).observeOn(AndroidSchedulers.mainThread()),(activity, response) -> activity.onItems(response.items),(activity, throwable) -> activity.onItemsError(throwable));}public void request(String name) {this.name = name;start(REQUEST_ITEMS);}
}

依赖包引入

基本引入

dependencies {compile 'info.android15.nucleus:nucleus:6.0.0'
}

如果需要使用NucleusSupportFragmentNucleusFragmentActivity,请引入

dependencies {compile 'info.android15.nucleus:nucleus-support-v4:6.0.0'
}

如果需要使用NucleusAppCompatActivity ,请引入

dependencies {compile 'info.android15.nucleus:nucleus-support-v7:6.0.0'
}

混淆配置

-keepclassmembers class * extends nucleus.presenter.Presenter{<init>();
}

对于RxJava2而言

dependencies {compile 'info.android15.nucleus5:nucleus:7.0.0'
}

如果需要使用NucleusSupportFragmentNucleusFragmentActivity,请引入:

dependencies {compile 'info.android15.nucleus5:nucleus-support-v4:7.0.0'
}

如果需要使用NucleusAppCompatActivity ,请引入:

dependencies {compile 'info.android15.nucleus5:nucleus-support-v7:7.0.0'
}

混淆配置

-keepclassmembers class * extends nucleus5.presenter.Presenter {<init>();
}

注:你也可以拷贝这些类到你个项目中使用

Android MVP伴侣,Nucleus框架使用简介相关推荐

  1. 【Android 逆向】substrate 框架 ( substrate 简介 | substrate 相关文档资料 )

    文章目录 一.substrate 简介 二.substrate 相关文档资料 一.substrate 简介 substrate 官网 : http://www.cydiasubstrate.com s ...

  2. android项目集成okgo,Android中MVP+RXJAVA+OKGO框架

    [实例简介] Android中MVP+RXJAVA+OKGO框架 Glide的封装 沉浸式状态栏 butterknife 和recyclerview的使用 [实例截图] [核心代码] 882096ee ...

  3. Android MVP 详解(上)

    作者:李旺成 时间:2016年4月3日 "Android MVP 详解(下)"已经发布,欢迎大家提建议. MVP 在 Android 上的使用其实已经有挺长一段时间了,长到似乎有点 ...

  4. 【Android 插件化】插件化简介 ( 组件化与插件化 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  5. Android 系统(75)---Android常用的网路框架

    Android常用的网路框架 Android常用的网路框架:  大多数应用程序基本都需要连接网络,发送一些数据给服务端,或者从服务端获取一些数据.通常在 Android 中进行网络连接一般使用 Sco ...

  6. Android 2018优秀开源框架整理收藏

    中级.高级.资深工程师 知其然知其不可然 <框架百大排行榜>里所提到的流行词.流行术语--使用能力.融会贯通其原理.讲解框架能力的高低,将让你不断的在这三个级别徘徊: 会有意识的合并榜单里 ...

  7. 简易集成的MVP模块化App框架(1/3)

    前言 一直想整理一个自己app框架,现在刚好不是很忙就整理一下,尚不成熟还有待改进 大纲 1.整体结构:MVP模式+模块化 2.网络框架:Retrofit+Rxjava 3.屏幕适配方案:头条的And ...

  8. android 优秀的开源框架整理

    程序员界有个神奇的网站,那就是github,这个网站集合了一大批优秀的开源框架,极大地节省了开发者开发的时间,在这里我进行了一下整理,这样可以使我们在使用到时快速的查找到,希望对大家有所帮助! 1. ...

  9. Android图片加载框架最全解析(三),深入探究Glide的缓存机制

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/54895665 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

最新文章

  1. php CI框架输出空行问题排查
  2. Oracle10g补丁怎么安装,在CentOS6.4上安装oracle10g需要的补丁
  3. 汇编:模拟C语言实现break与continue
  4. 实习第二弹——交换机的配置与统计
  5. LeetCode-175. 组合两个表(SQL语句中的LEFT JOIN)
  6. 程序员必备 Git 分支开发规范指南
  7. N元语法模型的数据稀疏问题解决方法之一:Good-Turing平滑
  8. Docker容器安全性分析
  9. 数字地球与计算机技术联系,数字地球与地球空间信息科学的关系
  10. java编写个倒计时_怎么编写一个倒计时java程序?求具体步骤!
  11. JSON转对象、List
  12. directsound播放32位float类型的pcm格式音频
  13. 计算机方法学,浅谈计算机教学的方法
  14. Git下载安装(官网) 拉取代码的两种方法
  15. 以DMA方式开启DAC输出正弦波
  16. 构造中小型园区网实训案例
  17. vmware安装打印机(win10)
  18. OpenDRIVE文件格式详解
  19. JAVA 关于图片上传的代码
  20. 鱼眼摄像头 实时动、静目标的检测,跟踪,分类

热门文章

  1. Linux报错:tar: Error Is Not Recoverable: Exiting Now
  2. 走进C 语言:你知道C语言程序是如何执行的吗?
  3. android 项目编译报错 符号: 类 shape 位置: 程序包 android.widget
  4. SSH信任关系配置(免密码登录)
  5. 离别,总免不了有些悲伤
  6. 《Python编程从入门到实践》(第2版)第二章 习题答案
  7. UTF-8的繁体与简体转换
  8. 【转】eclipse, Log4j配置(真心的详细~)
  9. 信任与背叛的折磨--电影
  10. 【IoT】产品设计:拼多多商业模式分析:互联网是商业模式的竞技场