又一个省略 {} 括号引发的 Bug

最近在项目中看到这么一段代码 //Rxjava... .onErrorReturn { if (cache.count() > 0) cache throw it } 本意应该是在 Rx流 出错时,试图返回 cache 的内容;若 cache 也不存在则继续 throw。 抛开本应在返回 cache 时要对之前 error 进行

read more »

Android Location 权限管理

写了一个LocationPermissionGranter类, 用Fragment隐藏了requestPermissions和onRequestPermissionsResult回掉的部分, 实现无论在Activity还是Fragment中都简单易用,并且不受屏幕旋转等影响。 使用方法: LocationPermissionGranter(this).requirePermission(object : LocationPermissionGranter.LocationPermissionListener { override fun onLocationPermissionGranted() { showMessage("onLocationPermissionGranted") } override fun onLocationPermissionDenied(shouldShowDialog: Boolean) { showMessage("onLocationPermissionDenied

read more »

实战RxJava之combineLatest & distinctUntilChanged

最近项目中碰到了这样一个需求: 在每当Tab切换到特定页面,并满足onResume状态 构建得到的查询条件和上一次成功查询条件不一致 时,查询并获取特定的信息。 通常的做法是: 添加切换Tab和onResume的Listener,在onResume的Listener中保存onResume状态。在切换Tab的Listener触发时检查onResume状态,满足则进入下一步 构建相应的查询条件,将查询条件和上一次成功的条件进行比较,如果不一致则查询并进入下一步 查询成功时记录上一次成功查询条件,失败时重置上一次成功查询条件为空 看上去可以Work,实际上大多数运行状况中也是可以的,但这里有个隐藏的前提条件: Tab切换到特定页面的事件后,onResume状态已经被设置好了 如果不满足这个条件,那么查询永远不会执行。 实际上,我们希望无论Tab切换到特定页面和满足onResume状态的先后顺序,只要在条件满足时就进行下一步。

read more »

Kotlin forEach隐藏开销

Kotlin中for-each有多种写法, 如常用的: for (foo in foos) { foo.thing() } foos.forEach { it.thing() } 除了对于 nullable / break 支持的区别,大部分情况下使用哪种写法纯粹是偏好: for vs forEach 然而针对Range进行枚举时要注意: forEach{} 存在着隐藏开销。 尽管 Iterable<

read more »