揭开google为android打造的响应式编程——agera面纱

2023-11-08 12:20

本文主要是介绍揭开google为android打造的响应式编程——agera面纱,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   两年前,推出RxJava。后来Square公司陆续推出RxAndroid、RxBus、RxBinding,把响应式编程发扬光大,深受开发者的喜爱。两年后,Google公司感觉不对劲,干脆自己推出全新的响应式编程,官方称之为Agera这名字听起来有点奇怪。官方是这样解析的:Agera(瑞典文的意思是"采取行动")是一个超轻量级的Android库,帮助Android应用中有生命周期的组件(比如:Activities)或者组件中的对象(比如:Views)预准备数据。 通过加入函数式响应式编程,Agera可以在时机、线程和数据层面上更清晰的分离处理流程,并且使用一个接近自然语言的单个表达式就能编写一个复杂的异步流。

先看下与Agera相关的专业术语以及相关用法:

1、Updatable(Observer)
翻译为:观察者
用途:接收事件通知,更新数据。 说明:观察者模式中的Observer,在Agera中使用Updatable

public interface Updatable {void update();
}

2、Observable
翻译为:被观察者、事件源
用途:作为事件源,通知观察者更新数据,可以注册、注销观察者。 说明:当事件发生的时候,调用dispatchUpdate()通知观察者。

public interface Observable {void addUpdatable(@NonNull Updatable updatable);void removeUpdatable(@NonNull Updatable updatable);
}

3、Supplier
翻译为:数据提供者
用途:get()新数据。

public interface Supplier<T> {@NonNullT get();
}

4、Repository
翻译为:Repository、数据仓库
用途:接收事件源、提供数据源的结合体。

public interface Repository<T> extends Observable, Supplier<T> {}

5、Reactive programming
翻译为:响应式编程
说明:一种面向数据流和变化传播的编程范式。 这意味着在编程语言中很方便地表达静态或动态的数据流,
而相关的计算模型会自动将变化的值通过数据流进行传播。 例如:在命令式编程环境中,a = b + c 表示将表达式的结果赋给a,
而之后改变b或c的值不会影响a。但在响应式编程中,a的值会随着b或c的更新而更新。


6、Activation lifecycle
翻译为:激活生命周期
用途:注册观察者:数据仓库变为激活状态;注销观察者:数据仓库变为非激活状态。


7、Active
翻译为:激活状态、活动状态


8、Inactive
翻译为:非激活状态、非活动状态


9、worker Looper thread
翻译为:有Looper的线程
说明:Agera 内部消息是通过Handler来完成的,所有线程需要有Looper。


10、Data Processing Flow
翻译为:数据处理流程


11、When, Where, What
翻译为:什么时候(时机),什么线程上[执行],什么数据


12、compiled repository
翻译为:编译数据仓库

Agera提供的函数响应式编程包括五个方面:content、net、database、rvdatabinding、rvadapter。其中content对Broadcast与SharePreference进行观察,net基于HttpUrlConnection结合请求体与响应体的封装,database是基于sqlite进行数据的增删查改。因此需要在gradle里面导入依赖包:

compile 'com.google.android.agera:agera:1.2.0-beta3'compile 'com.google.android.agera:content:1.2.0-beta3'
compile 'com.google.android.agera:database:1.2.0-beta3'
compile 'com.google.android.agera:net:1.2.0-beta3'
compile 'com.google.android.agera:rvadapter:1.2.0-beta3'
compile 'com.google.android.agera:rvdatabinding:1.2.0-beta3'
接下来看下ObservableLifeCycle,也就是观察者的生命周期:


  从上图可看出,Updatable是一个先进先出的队列:当调用start方法时,会回调addUpdatable(this)方法把对象添加到队列;当调用stop方法时,则回调removeUpdatable(this)方法,把对象从队列中移除。而Observable负责观察,调用update()方法进行更新。

再来看下UILifeCycle,Activity里生命周期的回调:


在Activity执行onCreate方法时,调用init方法进行初始化;执行onStart方法时,调用addUpdatable方法添加到队列;执行onStop方法时,则调用removeUpdatable方法从队列里移除;最后Activity被销毁执行onDestroy方法,调用GC回收。

接下来应该是最激动人心的时刻:Agera各个部分的使用介绍,首先要实现Receiver<Bitmap>和Updatable两个接口,并重写对应方法,演示网络请求加载图片。

public class AgeraActivity extends Activityimplements Receiver<Bitmap>, Updatable {private static final ExecutorService NETWORK_EXECUTOR =newSingleThreadExecutor();private static final ExecutorService DECODE_EXECUTOR =newSingleThreadExecutor();private static final String BACKGROUND_BASE_URL ="http://www.gravatar.com/avatar/4df6f4fe5976df17deeea19443d4429d?s=";private Repository<Result<Bitmap>> background;private ImageView backgroundView;@Overrideprotected void onCreate(final Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Set the content viewsetContentView(R.layout.activity_main);// Find the background viewbackgroundView = (ImageView) findViewById(R.id.background);// 创建一个repository: 包括一个图片请求。Initially// 初始值:absent, 配置通过网络获取屏幕大小的图片。background = repositoryWithInitialValue(Result.<Bitmap>absent()).observe() // 在这个例子中不需要刷新背景图,也就是不需要被观察者.onUpdatesPerLoop() // 在这个例子中每次都更新.getFrom(new Supplier<HttpRequest>() {@NonNull@Overridepublic HttpRequest get() {DisplayMetrics displayMetrics = getResources().getDisplayMetrics();int size = Math.max(displayMetrics.heightPixels,displayMetrics.widthPixels);return httpGetRequest(BACKGROUND_BASE_URL + size).compile();}}) // 实现带有显示大小参数的Http请求.goTo(NETWORK_EXECUTOR) // 设置网络请求线程.attemptTransform(httpFunction()).orSkip() // 设置http请求,如果失败,跳过下面流程.goTo(DECODE_EXECUTOR) // 设置解码线程.thenTransform(new Function<HttpResponse, Result<Bitmap>>() {@NonNull@Overridepublic Result<Bitmap> apply(@NonNull HttpResponse response) {byte[] body = response.getBody();return absentIfNull(decodeByteArray(body, 0, body.length));}}) // 解码图片, 如果失败返回absent.onDeactivation(SEND_INTERRUPT) // 中断线程.compile(); // 创建repository}@Overrideprotected void onResume() {super.onResume();// 注册观察者,激活流程background.addUpdatable(this);}@Overrideprotected void onPause() {super.onPause();// 注销观察者,去激活流程background.removeUpdatable(this);}@Overridepublic void update() {// repository更新时 调用// 如果bitmap有效, 发送到下面的accept()方法background.get().ifSucceededSendTo(this);}@Overridepublic void accept(@NonNull Bitmap background) {// 设置背景图片backgroundView.setImageBitmap(background);}
}

好了,Agera的基础应用已经介绍完了。让我们共同期待Google的正式推出Agera吧。

官方请关注:https://github.com/google/agera

demo下载:点击打开链接


这篇关于揭开google为android打造的响应式编程——agera面纱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369814

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念