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. mysql数据库查看各实例磁盘占用情况

    1.总体查看: use information_schema; select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),' ...

  2. 【Salvation】——怪物角色动画&主角碰撞死亡动画

    写在前面:这个动画功能同样也是使用JavaScript编写脚本,在Unity3D游戏引擎的环境中实现,在怪物的角色动画中,很多与人物相同,这里不再重复. 一.设计敌人 拖一个精英sprite到层次面板 ...

  3. 常用jar包之commons-digester使用

    常用jar包之commons-digester使用 学习了:https://blog.csdn.net/terryzero/article/details/4332257 注意了, digester. ...

  4. 关于insert|update|delete注入中的tips

    2.updatexml().extractvalue().name_const()函数的使用 3.I’ve noticed some variations in our payload. You ca ...

  5. Linux测网速

    $ wget https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py$ chmod a+rx speedtest_cli. ...

  6. SAS连接MYSQL的步骤及引用数据表

    1.建立逻辑库 libname  dz  ’物理路径'; 2.逻辑库做为桥梁连接SAS与MYSQL libname dz MYSQL USER=*****  PASSWORD=****  DATABA ...

  7. maven打包时无法加载lib下的jar

    © 版权声明:本文为博主原创文章,转载请注明出处 问题描述: 项目在本地部署没有问题,但是使用maven打包时报错: ***(引用jar中某个类的的路径) 不存在 ***(某个java类中的某行某列) ...

  8. HTML5之Canvas绘图(一) ——基础篇

    HTML5火的正热,最近有个想法也是要用到HTML的相关功能,所以也要好好学习一把. 好好看了一下Canvas的功能,感觉HTML5在客户端交互的功能性越来越强了,今天看了一下Canvas绘图,下边是 ...

  9. 重新编译Nginx指导手册【修复静态编译Openssl的Nginx漏洞 】(转)

    1. 概述    当前爆出了Openssl漏洞,会泄露隐私信息,涉及的机器较多,环境迥异,导致修复方案都有所不同.不少服务器使用的Nginx,是静态编译opensssl,直接将openssl编译到ng ...

  10. Java提高(二)---- HashTable

    阅读博客 java提高篇(二五)—–HashTable 这篇博客由chenssy 发表与2014年4月,基于源码是jdk1.7 ========================== 本文针对jdk1. ...