Android Weekly Notes Issue #275
Android Weekly Issue #275
September 17, 2017
Android Weekly Issue #275
本期内容包括给Google Map实现一个Marker Adapter, 如何更好的让Kotlin类可测试, MVI的优势 Google的Room与Paging Library相关文章, 以及Realm如何实现React, 还有比较冷门的AsyncListUtil如何使用的介绍哦.
ARTICLES & TUTORIALS
MapMe — the Android maps adapter
作者基于Google Map写了一个类似RecyclerAdapter的东西, 叫做GoogleMapMeAdapter, 可以通过继承实现其onCreateAnnotation与onBindAnnotation接口, 来控制Map Marker的显示, 在地图初始化成功后通过attach(mapView: MapView, googleMap: GoogleMap)来绑定即可.
CloudRail - Connect to APIs 10x Faster
请注意, 这是一个广告, 一个Android课程的广告.
Kotlin Testability – Part 1
作者论述了如何创建一个可测的类, 相较我们平时常用的将内部其他模块最为参数注入的方法, 作者指出会暴露我们的具体实现, 转而抽象出一个接口, 并给与内部实现, 在测试的时候只需另行实现接口进行mock即可.
大概是这个样子
class DateStringProvider internal constructor(private val factory: Factory) {
constructor() : this(DefaultFactory)
fun buildDateString() =
factory.getLocalisedDateTimeFormatter().format(factory.getLocalDateTime()) as String
internal interface Factory {
fun getLocalDateTime(): LocalDateTime
fun getLocalisedDateTimeFormatter(): DateTimeFormatter
}
private object DefaultFactory : Factory {
override fun getLocalisedDateTimeFormatter(): DateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
override fun getLocalDateTime(): LocalDateTime = LocalDateTime.now()
}
}
ViewModels and LiveData: Patterns + AntiPatterns
作者介绍了Android新推出的Archietecture Component相关的架构实现, 其实大部分与Android官方的Document, 讲述了如何正确使用ViewModel去实现数据加载, 防止内存泄露, 并且阐述了一些关键的要素.
- ViewModel不要与Android Framework耦合
- Activity与Fragment的逻辑应该最简化
- ViewModel不能持有View的对象
- UI应该通过Observe的方式从ViewModel得到数据更新, 而不应该是Push进去
- 通过DataRepository与数据进行交互
- LiveData最好与Repository也是订阅关系,防止ViewModel泄露
Taming state and side effects on Android
讲述了一个很复杂的React方式进行状态管理的东西.
Reactive Apps With MVI - PART 7
文章继续MVI的推介, 间接抨击了Google的Architecture Component, LiveData通过SingleLiveEvent来规避如何保存View#State的问题, 通过SnackBar Show/Hide的例子介绍了MVI很好的解决了这种问题.
Make your Android Project pop with Remixer
介绍了Google的一个NB lib Remixer, 不需要重新编译就可以适配你的UI, 支持输出Number,String,Boolean,Color.
效果如下

Creating a Reactive Data Layer with Realm and RxJava2
文章介绍了Realm React的演进, 从Rx1升级到Rx2, 让创建一个react的DataLayer变得很简单.
// not singleton!
public class TaskRepository {
private final Realm realm;
public TaskRepository(Realm realm) {
this.realm = realm;
}
// this implementation works on any thread.
public Flowable<Task> getTasks() {
if(realm.isAutoRefresh()) { // for looper threads. Use `switchMap()`!
return realm.where(Task.class)
.findAllSortedAsync(TaskFields.ID)
.asFlowable()
.filter(RealmResults::isLoaded);
} else { // for background threads
return Flowable.just(realm.where(Task.class).findAllSorted(TaskFields.ID));
}
}
}
How to use AsyncListUtil
介绍了如何使用隐藏很深缺缺乏文档的AsyncListUtil去优化RecyclerView的加载, 减少内存占用, 当你有很多数据的却不想全部存在内存, 核心是去实现AsyncListUtil.DataCallback与AsyncListUtil.ViewCallback两个接口, 第一个提供fillData与getCount两个方法, 第二提供onDataRefresh,getItemRangeInto,onItemLoaded 三个方法, 然后需要添加ScrollListener在滚动的时候触发AsyncListUtil#onRangeChanged.
但其核心思想还是通过Cursor来读取数据, 在fillData里面来填充, 所以根本在于数据库提供的优势, 其实还不如用CursorRecyclerAdapter来的直接.
Android Development Syllabus
又是一个课程.
Large Database Queries on Android
介绍了SQLiteCursor实现大数据查阅的弊端.
SQLiteCursor不持有任何打开的数据库会话, 每次都是新开窗口SQLiteCursor.getCount会扫描所有query的数据然后进行countSQLiteCursor.getCount每次都会load第一个Window, 如果你使用到第三个Window的数据,它会强制load然后丢掉不用的SQLiteCursor会加载你不需要的数据,因为当你读到超过窗口1/3的时候,它会触发并填充整个窗口SQLiteCursor加载位置不确定, 因为它需要提前加载1/3个窗口,需要猜测一个窗口需要多少列- 需要Close
SQLiteCursor不知道数据发生了变化
规避办法,就是尽量的分页读取,推荐使用Room&Paging Library
Building a Guitar Chord Tutor for Actions on Google: Part One
介绍了自己使用Google Actions做一个教吉他和弦的Demo.
DESIGN
On the Bottom Navigation Bar
文章介绍了使用BottomNavigationView后由BackButton带来的交互问题, Back了该跳到哪里去.
Library
material-remixer-android
上面介绍过, 不需要重新编译就可以通过代码来控制UI.
AdaptiveIconPlayground
一个测试Adaptive Icon的东西.
MapMe
给GoogleMap的Marker做了一个Adapter.
Paging Library
让LiveData支持Paging.
Android Weekly Notes Issue #275的更多相关文章
- 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 #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并发布为开源库的完 ...
- Android Weekly Notes Issue #234
Android Weekly Issue #234 December 4th, 2016 Android Weekly Issue #234 本期内容包括: ConstraintLayout的使用; ...
随机推荐
- Git历险记(四)——索引与提交的幕后故事
我想如果看过<Git历险记>的前面三篇文章的朋友可能已经知道怎么用git add,git commit这两个命令了:知道它们一个是把文件暂存到索引中为下一次提交做准备,一个创建新的提交(c ...
- 微信小程序 - 传参的几种方式
1. navigator navigator?第一参数&第二参数 .... 在传递页面的options可以拿到传递过来的参数 <navigator url='start-test/sta ...
- 身份证识别接口编写的JAVA调用示例
此java文章是基本聚合数据证件识别接口来演示,基本HTTP POST请求上传图片并接收JSON数据来处理. 使用前你需要通过 https://www.juhe.cn/docs/api/id/153 ...
- 对于Json和对象转换的学习
学习这个的用处有非常多的: 在传输数据过程中比較查看数据比較清晰,代码也较清晰.也能够避免split函数带来的隐藏bug 当然也有不足: 准备工具较繁琐,须要准备对象(当然 ...
- JSF教程(8)——生命周期之Apply Request Values Phase
当一个组件树在一个postbacks请求中被恢复之后其中每一个组件从request的參数中取得各自的值,这里使用的是processDecodes方法. 这个值会保存在本地的每一个组件中,在源代码中此过 ...
- 一篇文章说完Java的垃圾回收过程
想要了解java的垃圾回收过程首先要理解java堆的内存模型,简单表示如下: 从上面的图片可以看出,java的堆内存可以简单的分为,新生代和老年代,在新生代中有分为三个区域,1个Eden区和2个S ...
- Linux 下wifi 驱动开发(三)—— SDIO接口WiFi驱动浅析
SDIO-Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈.可以实现用户主平台数据通过SDIO口到无线网络之间的转 ...
- centOS 7中上网以及网卡的一些设置
在VMWare中安装LinuxOS是个非经常见的事情. 可是,关于虚拟机的上网问题.想在这里总结一下,里面还有不懂的问题.希望能够得到前辈的解惑. 一.VMWare网卡的设置的三种选项: Bridge ...
- Node.js下载及安装
Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用. Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适 ...
- java从apk文件获取包名、版本号、icon
依赖:仅依赖aapt.exe 支持:仅限windows 功能:用纯java获取apk文集里的包名,版本号,图标文件[可获取到流直接保存到文件系统] 原理:比较上一篇文章里通过反编译然后解析Androi ...