Android Weekly Notes Issue #255
Android Weekly Issue #255
April 30th, 2017
Android Weekly Issue #255
本期内容包括: 一种在RxJava中显示loading/content/error的好的处理方法; Android O中的一些隐藏宝藏; Uber app的immutable的数据升级; MVP模式下, 不要再做view != null
的判断了; 用Dagger2实现的依赖注入; 迁移应用到Kotlin; 如何把Gradle插件从Groovy迁移到Kotlin; Activity中的静态start方法使用; Firebase的实时数据库使用.
ARTICLES & TUTORIALS
LCE: Modeling Data Loading in RxJava
作者介绍了一种方法, 用RxJava来处理显示loading/内容/错误的逻辑.
核心思想是中这个结构把数据包一层:
// Lce -> Loading / Content / Error
class Lce<T> {
public static <T> Lce<T> data(T data) {
// implementation
}
public static <T> Lce<T> error(Throwable error) {
// implementation
}
public static <T> Lce<T> loading() {
// implementation
}
boolean isLoading();
boolean hasError();
Throwable getError();
T getData();
}
然后实际处理的代码就变成了这样:
repository.getDataEventStream().subscribe({ event ->
if (event.isLoading) {
view.showLoading(true)
} else if (event.hasError()) {
view.showError(event.getError())
} else {
view.showData(event.getData())
}
})
怎么构建这个Observable呢:
Observable<Lce<Data>> getDataEventStream() {
return api.getData()
.map(data -> Lce.data(data))
.startWith(Lce.loading())
.onErrorReturn(e -> Lce.error(e))
}
更多构建方法见原文.
Hidden Gems of Android O
作者仔细看了Android O的API Diff, 然后发现了一些隐藏的宝藏拿出来分享.
- Storage Access Framework的改进.
- RecoverableSecurityException.
- SharedPreferences支持更换底层实现.
SmsManager.createAppSpecificSmsToken()
提供的更好的短信验证流.- 锁屏情况下的显示处理:
Keyguard.dismissKeyguard()
. - 全屏Activity的旋转处理.
Engineering Stability in Migrations
Uber的数据类生成及迁移到Immutable Collections的过程.
Don’t put view != null checks in your Presenters
如果你使用了MVP模式, 并且你的presenter在configuration变化时是一直存在的, 那么你的presenter至少会有下面两个方法:
void attachView(View)
void detachView()
这样的话你的getView()
方法应该被标记为@Nullable
, 然后你就需要在很多地方做null判断, 即便有些地方你100%地肯定View肯定不为null.
Presenter的方法直接从View中被调用
比如那些View中UI控件点击导致的调用.
加个view != null
的判断有一个缺点就是如果attach时出现了问题, 这时用户点击了按钮却没有反应, 这个错误会被忽略和隐藏起来. 在这种View应该存在的情形下, 如果得到了null, 应该及时抛出异常发现错误.
It’s always a bad sign when the else branch is missing.
解决方案: 加个@NonNull View getViewOrThrow()
方法:
@Nullable
public MyView getView() {...}
@NonNull
public MyView getViewOrThrow() {
final MyView view = getView();
if (view == null) {
throw new IllegalStateException("view not attached");
}
return view;
}
在Presenter中异步调用View
很多时候我们需要异步调用View的方法, 这时候我们就不能用getViewOrThrow()
了, 因为View被detach是一种合理的情况.
这时候我们如果加个if (view != null)
是可以解决这个问题的, 但是却是一个错误的选择. 因为else分支的缺失, 用户可能错过了server返回的结果, 然后永远地等下去.
一个比较好的解决方案就是ThirtyInch, 它有一个方法叫sendToView(ViewAction), 它会推迟ViewAction
的执行, 到View再次被attach的时候执行. 如果View已经处于attached的状态, 那么就立即执行.
一个例子:
public class MyPresenter extends TiPresenter<MyView> {
public void onSubmitLogin(final Credentials credentials) {
mLoginService.login(credentials).subscribe(
success -> {
sendToView(view -> view.close());
},
error -> {
sendToView(view -> view.showError(error));
});
}
}
注意请不要过度使用sendToView()
.
如果你用MVI模式, 维护一个ViewModel, 在变化的时候渲染到View, 同样也可以删掉view != null
的判断. 见My take on Model View Intent (MVI) — Part 1: State Renderer.
Optional和WeakReference
这篇文章中用了view == null
作为View被detached了的依据. 如果你使用了其他的包装, 比如WeakReference
或者Optional
, 你虽然不用null判断了但是并不代表你解决了问题, 你需要做其他的判断并且lint不能帮你做提示了.
结论
你并不需要if (view != null)
检查:
- 当你确定View是attached时, 使用
getViewOrThrow()
. - 当View可能会是detached时, 使用
sendToView(ViewAction)
, 来支持else的处理.
Dependency Injection in Android with Dagger 2
一个用了Retrofit和MVP模式的应用, 用Dagger2做依赖注入的例子.
How we made Basecamp 3’s Android app 100% Kotlin
作者他们如何把应用改为用Kotlin.
Migrate a Gradle Plugin from Groovy to Kotlin
如何把一个用Groovy写的Gradle插件转化成Kotlin写的.
Object Oriented Tricks: #4 Starter Pattern
在Activity中定义一个静态的start()
方法, 把需要放在intent中的参数都当做方法参数传进来.
Android Studio对此有一个内置的模板, 你只要输入starter
, 按回车就可以生成这个方法.
Using Firebase as a Real Time System
Firebase的Real Time Database.
数据库存储的信息以NoSQL的形式放在Google Cloud上.
三个主要的优点: 实时,离线处理, 自动同步.
文中展示了基本的用法.
之后提供了实时数据库的几种使用思路:
- 实时通讯: (Firechat);
- 显示实时位置的地图(Realtime geolocation tracking with Firebase, geofire);
- 排名.
LIBRARIES & CODE
Bubble-Picker
气泡选择器.
UltimateAndroidReference
Android资源收集, 包括库, 开源项目, 书籍博客等等.
litho-picasso
为Litho写的picasso库.
Android Weekly Notes Issue #255的更多相关文章
- Android Weekly Notes Issue #230
Android Weekly Notes Issue #230 November 6th, 2016 Android Weekly Issue #230. Android Weekly笔记, 本期内容 ...
- Android Weekly Notes Issue #227
Android Weekly Issue #227 October 16th, 2016 Android Weekly Issue #227. 本期内容包括: Google的Mobile Vision ...
- Android Weekly Notes Issue #237
Android Weekly Issue #237 December 25th, 2016 Android Weekly Issue #237 这是本年的最后一篇issue, 感谢大家. 本期内容包括 ...
- Android Weekly Notes Issue #229
Android Weekly Issue #229 October 30th, 2016 Android Weekly Issue #229 Android Weekly笔记, 本期内容包括: 性能库 ...
- Android Weekly Notes Issue #222
Android Weekly Issue #222 September 11th, 2016 Android Weekly Issue #222 ARTICLES & TUTORIALS Fo ...
- Android Weekly Notes Issue #221
Android Weekly Issue #221 September 4th, 2016 Android Weekly Issue #221 ARTICLES & TUTORIALS And ...
- Android Weekly Notes Issue #219
Android Weekly Issue #219 August 21st, 2016 Android Weekly Issue #219 ARTICLES & TUTORIALS Andro ...
- Android Weekly Notes Issue #236
Android Weekly Issue #236 December 18th, 2016 Android Weekly Issue #236 本期内容包括: Google的物联网平台Android ...
- Android Weekly Notes Issue #235
Android Weekly Issue #235 December 11th, 2016 Android Weekly Issue #235 本期内容包括: 开发一个自定义View并发布为开源库的完 ...
随机推荐
- fiddler不能监听 localhost和 127.0.0.1的问题 .
localhost/127.0.0.1的请求不会通过任何代理发送,fiddler也就无法截获. 解决方案 用 http://localhost. (locahost紧跟一个点号) 用 http://1 ...
- 云数据库 RDS 版怎么创建数据库和账号MySQL 5.7版
若要使用云数据库RDS,您需要在实例中创建数据库和账号.对于MySQL 5.7版本的实例,您需要通过RDS控制台创建一个初始账号,然后可以通过数据管理(DMS)控制台创建和管理数据库.本文将主要介绍在 ...
- 27:简单错误记录SimpleErrorLog
题目描述 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号. 处理: 1. 记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加: ...
- detect——point_in_polygon
/******************实现功能:判断平面任一点是否在指定多边形内********************/ #include <string> #include <v ...
- Controller跳转到外部链接
return new ModelAndView(new RedirectView("http://www.baidu.com")); 用了这个方法之后,方法的返回值也会变成mode ...
- mysql中的类型转换和精确位数
select round(123.5); 四舍五入 select floor(123.5);取整数部分 select ceil(123.5);四舍五入
- mysql日期格式转化
select DATE_FORMAT( '20170701', '%Y-%m-%d'); 先挖坑
- java中的双重锁定检查(Double Check Lock)
原文:http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization#theCommentsSect ...
- Azure、数据、AI开发工具
Azure.数据.AI开发工具 在今天召开的 Connect(); 2017 开发者大会上,微软宣布了 Azure.数据.AI 开发工具的内容.这是第一天的 Connect(); 2017 的主题演讲 ...
- easyUI中 datagrid 格式化日期
$('#List').datagrid({ url: '@Url.Action("GetList")', width:SetGridWidthSub(10), methord: ' ...