【译】Room 🔗 Coroutines

原文链接:https://medium.com/androiddevelopers/room-coroutines-422b786dc4c5
作者:Florina Muntenescu

Room从2.1版本(目前已更新到2.2.0-alpha03版本)开始添加了对kotlin协程的支持。现在我们可以使用suspend关键字将DAO中的方法声明为挂起函数,从而保证这些方法不在主线程中执行。请继续阅读以理解如何在Room中使用协程,它的工作原理,以及如何测试这个新功能。

Java多线程之先行发生原则(happens-before)

前面介绍了Java内存模型及内存屏障相关概念,这篇文章接着介绍多线程编程另外一个比较重要的概念:先行发生原则(happens-before)。

重要性

happens-before是判断数据是否存在竞争,线程是否安全的主要依据,通过这个原则,我们可以解决并发环境下两个操作之间是否可能存在冲突的所有问题。

happens-before是什么

它Java内存模型中针对两项操作定义的偏序关系。例如操作A先行于操作B发生,那么操作B可以观察到操作A所产生的所有影响,这些影响包括修改内存中共享变量的值、发送的消息,调用的方法等。

Java多线程之volatile关键字及内存屏障

前面一篇文章在介绍Java内存模型的三大特性(原子性、可见性、有序性)时,在可见性和有序性中都提到了volatile关键字,那这篇文章就来介绍volatile关键字的内存语义以及实现其特性的内存屏障。

volatile是JVM提供的一种最轻量级的同步机制,因为Java内存模型为volatile定义特殊的访问规则,使其可以实现Java内存模型中的两大特性:可见性和有序性。正因为volatile关键字具有这两大特性,所以我们可以使用volatile关键字解决多线程中的某些同步问题。

volatile的可见性

volatile的可见性是指当一个变量被volatile修饰后,这个变量就对所有线程均可见。白话点就是说当一个线程修改了一个volatile修饰的变量后,其他线程可以立刻得知这个变量的修改,拿到最这个变量最新的值。

Java多线程之Java内存模型

在介绍Java内存模型之前,我们先介绍一下计算机硬件的内存模型,因为JVM的并发和物理机器的并发很相似,甚至JVM并发操作中很多设计都是因为计算机系统的设计引发的。

硬件的内存模型

大家都知道计算机系统处理任务主要是靠处理器(CPU)来进行运算的,而运算中又会涉及到数据,数据在哪呢,数据自然是存储在计算机内存中,所以处理器在运算过程中不可避免的会涉及到与内存的读写交互,比如读取运算所需的数据,存储运算得到的数据结果等。而处理器的运算速度相比物理内存的读写速度要快得多,所以会出现处理器要等待内存数据读写结束后才能进行下一步的运算,因此为了提高计算机的运算速度,现在的计算机系统为处理器添加了一层读写速度尽量接近处理器的高速缓存来缓解内存与处理器之间的性能差异。这样在处理任务时将运算需要的数据复制到缓存中,运算结束后再将数据从缓存中同步写回到内存,这样处理器在运算时就不需要等待内存数据读写结束了。

Android模块化开发配置

模块化

  1. 项目由多个模块组成
  2. 每个模块都是一个独立的Feature或组件
  3. 业务模块间解耦不相互直接依赖
  4. 业务模块与公共组件模块通过aar依赖
  5. 每个模块独立开发,独立运行调试

模块化的好处

当一个项目越来越大,越来越复杂后,代码量就会变得越来大,难以阅读难以维护,业务之间出现耦合的可能性也会越来越大,同时整个APP编译调试的时间也会越来越长。

而使用模块化开发则可以解决以上问题:

  1. 项目代码结构清晰,每个Feature和公共组件都是一个独立的Library模块
  2. 避免每个Library模块间的直接耦合
  3. 提升模块的复用性
  4. 单个模块独立编译调试速度更快,节省开发时间
  5. 只关注自己所在的模块,从而避免其他Feature的异常block自己的Feature开发

但是…这篇文章不是教你如何进行模块化开发,而是介绍如何进行模块化开发的工程配置,以满足模块化开发过程中的多团队协作问题。

Android中用Kotlin Coroutine(协程)和Retrofit进行网络请求和取消请求

Kotlin Coroutine(协程)系列:
1. Kotlin Coroutine(协程) 简介
2. Kotlin Coroutine(协程) 基本知识
3. Android中用Kotlin Coroutine(协程)和Retrofit进行网络请求和取消请求

前面两篇文章介绍了协程的一些基本概念和基本知识,这篇则介绍在Android中如何使用协程配合Retrofit发起网络请求,同时介绍在使用协程时如何优雅的取消已经发起的网络请求。

Kotlin Coroutine(协程) 基本知识

Kotlin Coroutine(协程)系列:
1. Kotlin Coroutine(协程) 简介
2. Kotlin Coroutine(协程) 基本知识
3. Android中用Kotlin Coroutine(协程)和Retrofit进行网络请求和取消请求
这篇文章主要介绍协程中的一些基本概念。

挂起函数(suspend关键字)

Flutter实战之封装一个LinearLayout

APP开发过程中,经常遇到需要添加背景、设置边距、动态显示和隐藏某个组件。

但是在Flutter中,能同时具有添加背景、设置边距、阴影、边框、圆角的布局只有Container(参考我上一篇文章的介绍Flutter入门之Row、Column、Container布局),这个已经算是业务功能比较多的组件了,而要想实现组件的显示和隐藏则需要用到另外一个组件Offstage,水平的线性布局则需要用到组件Row,垂直的线性布局则需要用到组件Column,而RowColumn这两个布局都不具备直接设置背景、边距、显示和隐藏等功能。

Flutter入门之Row、Column、Container布局

写过Android的都知道Android中有个很常用布局LinearLayout,它可以实现线性的横向或纵向的布局结构。对于学习FlutterAndroid开发者来说,肯定也想知道Flutter中该如何实现线性布局结构。

Flutter中线性布局结构的实现是通过两个不同的widget分别来实现横向和纵向布局结构的。组件Row用来实现横向的线性布局,而组件Column则用来实现纵向的线性布局,而Container则是用来设置背景、设置大小、设置边距(padding)的布局。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×