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, 可以通过继承实现其onCreateAnnotationonBindAnnotation接口, 来控制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.DataCallbackAsyncListUtil.ViewCallback两个接口, 第一个提供fillDatagetCount两个方法, 第二提供onDataRefresh,getItemRangeInto,onItemLoaded 三个方法, 然后需要添加ScrollListener在滚动的时候触发AsyncListUtil#onRangeChanged.

但其核心思想还是通过Cursor来读取数据, 在fillData里面来填充, 所以根本在于数据库提供的优势, 其实还不如用CursorRecyclerAdapter来的直接.

Android Development Syllabus

又是一个课程.

Large Database Queries on Android

介绍了SQLiteCursor实现大数据查阅的弊端.

  • SQLiteCursor不持有任何打开的数据库会话, 每次都是新开窗口
  • SQLiteCursor.getCount会扫描所有query的数据然后进行count
  • SQLiteCursor.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的更多相关文章

  1. Android Weekly Notes Issue #230

    Android Weekly Notes Issue #230 November 6th, 2016 Android Weekly Issue #230. Android Weekly笔记, 本期内容 ...

  2. Android Weekly Notes Issue #227

    Android Weekly Issue #227 October 16th, 2016 Android Weekly Issue #227. 本期内容包括: Google的Mobile Vision ...

  3. Android Weekly Notes Issue #237

    Android Weekly Issue #237 December 25th, 2016 Android Weekly Issue #237 这是本年的最后一篇issue, 感谢大家. 本期内容包括 ...

  4. Android Weekly Notes Issue #229

    Android Weekly Issue #229 October 30th, 2016 Android Weekly Issue #229 Android Weekly笔记, 本期内容包括: 性能库 ...

  5. Android Weekly Notes Issue #221

    Android Weekly Issue #221 September 4th, 2016 Android Weekly Issue #221 ARTICLES & TUTORIALS And ...

  6. Android Weekly Notes Issue #219

    Android Weekly Issue #219 August 21st, 2016 Android Weekly Issue #219 ARTICLES & TUTORIALS Andro ...

  7. Android Weekly Notes Issue #236

    Android Weekly Issue #236 December 18th, 2016 Android Weekly Issue #236 本期内容包括: Google的物联网平台Android ...

  8. Android Weekly Notes Issue #235

    Android Weekly Issue #235 December 11th, 2016 Android Weekly Issue #235 本期内容包括: 开发一个自定义View并发布为开源库的完 ...

  9. Android Weekly Notes Issue #234

    Android Weekly Issue #234 December 4th, 2016 Android Weekly Issue #234 本期内容包括: ConstraintLayout的使用; ...

随机推荐

  1. 利用js实现table增加一行

    简单的方法: 用jquery插件,比如设置该table的id为mytable <table id="mytable"> <tr> <td> 第一 ...

  2. struts2.16中文乱码问题解决

    方法1.在struts.xml文件中添加<constant name="struts.i18n.encoding" value="GBK" /> 方 ...

  3. java把一个文件的内容复制到另外一个文件

    /** * java把一个文件的内容复制到另外一个文件 */import java.io.File;import java.io.FileInputStream;import java.io.File ...

  4. Windows 2008 R2 Server FTP使用问题

     Windows 2008 R2 Server FTP必须在安装IIS的时候.安装IIS6.0兼职性. 否则建的FTP网站仅仅有关了防火墙才干使用. 原因未知.

  5. .net安装windows服务和生产webservice

    安装windows服务 1.打开cmd对话框. 2.输入 cd WINDOWS\Microsoft.NET\Framework64\v2.0.50727\ 3.回车 4.输入InstallUtil.e ...

  6. SW线路中串联1K电阻的作用

    主要作用的去ESD,去干扰 和ADC上串的一样一样的作用 物美价廉的ESD方案 我还是觉得起到控制开关打开的快慢,也就是控制开关脉冲的上升沿,加了这个1K电阻,可以减缓上升延的斜率.如果上升沿过快,会 ...

  7. C 语言学习 3

    [程序3] 题目:一个整数,它加上100后是一个全然平方数.再加上168又是一个全然平方数.请问该数是多少? 1.程序分析:在10万以内推断.先将该数加上100后再开方,再将该数加上268后再开方,假 ...

  8. wampserver 安装多个php版本号报错之关键问题

    近期喜欢上用wampserver来搭建php本地执行环境 主要是一键安装 特easy 之前一直用的是 appserv 也挺好用的 用了wamp后 才发现wamp更好用 duang duang 默认下载 ...

  9. ASP.NET MVC路径引用总结

    1.关于路径: (1)绝对路径 包含站点路径的路径:<a href=”http://www.baidu.com/about.jpg”>百度</a> 站点改变路径失效: (2)相 ...

  10. linux SPI驱动——spidev之driver(六)

    一: spidev_init注册spidev 1: static int __init spidev_init(void) 2: { 3: int status; 4:   5: /* Claim o ...