RxJava操作符
RxJava操作符官网地址:http://reactivex.io/documentation/operators.html
按照操作符的类型可分为:创建操作符,变换操作符,过滤操作符,组合操作符,错误操作符,辅助操作符,条件和布尔操作符,算术和聚合操作符 及 连接操作符 等。
RxJava3 中 Action被弃用了,改为Consumer
创建操作符
create传入自定义Onsubscribe。
12345678Observable.create(new Observable.OnSubscribe<T>(){ @Overrode public void call(Subscriber<? super T>) sub){ sub.onNext("0"); sub.onNext("1"); sub.onCompleted(); }})
from 传入数组:
12String list = {"0","1",&qu ...
Java 响应式编程【Reactive Programming in Java】
Java 响应式编程【Reactive Programming in Java】学习来源:Exploring reactive programming in Java by Miro Cupak
最近学习RxJava。RxJava 在 GitHub 主页上的自我介绍:
RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.
翻译:RxJava是Reactive Extensions(响应式扩展)在 Java VM 上的实现,是一个使用可观测的序列来组成异步的、基于事件的程序的库。
两个关键词:Reactive Extensions,asynchronous 。
RxJava 的核心是响应式编程,所解决的问题是“异步”。
所以在学习Rx库之前,有必要了解下什么是响应式编程。
RXReactive Extensions是指什么。
Rx取自于 ...
观察者模式&&订阅发布模式
观察者模式&&订阅发布模式参考:知乎-观察者模式 vs 发布订阅模式
观察者模式
原理:其实就是在Subject类中维护了一个Observer的队列。
调用 Subject.订阅(mObserver)方法就是把该mObserver放入队列中。
当Subject中发生变化时,遍历Observer队列,依次调用Observer的收到通知方法。
即完成了观察者模式。
这里有个纠结的地方困扰了我好久:明明是Observer观察者(比如用户、人)订阅了Subject(比如报刊、公众号),代码里却要写成 Subject.订阅(mObserver)。很绕??
这里这么想:
虽然是你订阅了报刊,实际上报刊在 订阅者列表 中把你加了进去。核心操作是由被观察者 Subject 做的!!!
你关注了一个公众号,实际是你把你的ID告诉了公众号,让公众号每次更新的时候告诉你一声。核心是公众号,即被观察者。
所以是Subject.订阅(mObserver)
发布/订阅模式一开始以为两个模式是一样的。后来才发现还是有区别的:
严格来说,这种才是发布/订阅模式。
Publisher内部不直接维 ...
Vector和List的区别
Vector:顺序表优点:和数组类似开辟一段连续的空间,并且支持随机访问,所以它的查找效率高其时间复杂度O(1)。缺点:由于开辟一段连续的空间,所以插入删除会需要对数据进行移动比较麻烦,时间复杂度O(n),另外当空间不足时还需要进行扩容。
List:链表优点:底层实现是循环双链表,当对大量数据进行插入删除时,其时间复杂度O(1)缺点:底层没有连续的空间,只能通过指针来访问,所以查找数据需要遍历其时间复杂度O(n),没有提供[]操作符的重载。
应用场景vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随即访问,而不在乎插入和删除的效率,使用vector。
list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用list。
Fragment简介
Fragment简介Fragment(翻译为片段)可以作为Activity 布局的一部分,必须依托于Activity,但又拥有自己的生命周期。其生命周期同时受到宿主Activity生命周期的影响。例如,当 Activity 暂停时,Activity 的所有片段也会暂停;当 Activity 被销毁时,所有片段也会被销毁。
不过,当 Activity 正在运行(处于onResume生命周期状态)时,您可以独立操纵每个片段,如添加或移除片段。当执行此类片段事务时,您也可将其添加到由 Activity 管理的返回栈 — Activity 中的每个返回栈条目都是一条已发生片段事务的记录。
生命周期
其中,onCreate()、onStart()、onPause() 和 onStop()方法和Activity 非常相似。所以Google官方称Fragment有点像可以在不同 Activity 中重复使用的“子 Activity”。
onAttach():在片段已与 Activity 关联时进行调用(Activity 传递到此方法内)。
onCreate():系统会在创建片段时调用此方法。
[on ...
Navigation导航
Navigation导航概述Android Jetpack 组件之一,用来实现不同片段(Fragment)之间的交互导航。且遵循谷歌官方导航既定原则。
用途Navigation 组件旨在用于具有一个主 Activity 和多个 Fragment 目的地的应用。主 Activity 与导航图相关联,且包含一个负责根据需要交换目的地的 NavHostFragment。
在具有多个 Activity 目的地的应用中,每个 Activity 均拥有其自己的导航图。
优势
可视化
集中管理
自动处理
深层链接 Deep Linking
动画
安全
基础用法
资源文件中新建res/navigation/navigation.xml;
主activity布局中需要有个一fragment与之(navigation.xml)绑定;
1234567891011...//绑定即:后续所有的导航、跳转 都是在这个main_fragment中完成了//所以要加`app:defaultNavHost="true"`,拦截系统的返回键,fragment内部响应<fragment ...
Java对象组成 64位
网上结论多以32位系统为主。本文基于64位,力求简介,不会写太多废话,但能保证写出来的都是可供验证的客观事实。
验证工具:jol-cli
代码环境:64位 windows系统
Java普通对象的组成【非数组】三部分:对象头,实例数据,对齐填充。
对象头开启指针压缩:8 byte + 4 byte =12 byte ==> 96 bit **默认**✔
不开启指针压缩:8 byte + 8 byte =16 byte ==> 128 bit
Mark Word64位 Win环境下,Mark Word占 8 byte ==> 64bit
此处仅讨论无锁【Normal】状态下:25 + 31 + 1 + 4 + 1 + 2 = 64 bit。
Klass 指针【指向其类的元数据的指针】JVM通过这个指针确定对象是哪个类的实例。
开启指针压缩:4 byte
不开启指针压缩:8 byte
实例数据对象中实实在在的数据:int 4,short 2,long 8,byte 1,char 2 ,float 4,double 8,单位byte,转bit *8。
对齐填 ...
Android屏幕刷新机制(二): invalidate()发生了什么
Android屏幕刷新机制(二): invalidate()发生了什么参考文章完全参考自:Android 屏幕刷新机制,简化了部分代码逻辑。
invalidate()如果大家了解View体系里的相关知识应该知道,每个Activity 的根布局都是 DecorView,DecorView 的 parent 又是 ViewRootImpl,所以子view执行invalidate()方法时最终会引导到ViewRootImpl中来。
看ViewRootImpl的 invalidate()方法:
12345678910111213141516171819void invalidate() { mDirty.set(0, 0, mWidth, mHeight); if (!mWillDrawSoon) { scheduleTraversals(); }}void scheduleTraversals() { if (!mTraversalScheduled) { mTraversalS ...
Android屏幕刷新机制(一):屏幕刷新发生了什么
Android屏幕刷新机制(一):屏幕刷新发生了什么参考文章完全参考自:Android 屏幕刷新机制
不过原文是从源码揭秘的角度从代码调用的层面层层深入到了底层,教着看源码摸原理。本文倒着来,直接说了原理,然后按着Android系统的步骤看代码是怎么走的。
开始硬件——屏幕发送信号Android 屏幕每16.6ms刷新一次【60fps,即1000ms/60f = 16.6ms】。也就是屏幕【Display】每隔16ms就会发出一次VSYNC信号。
系统——接收屏幕传来的VSync信号接收此信号系统类叫DisplayEventReceiver,是个抽象类。
12345678910111213141516171819202122232425262728293031323334353637383940414243/** * Provides a low-level mechanism for an application to receive display events * such as vertical sync. * * The display event receive is N ...
装饰者模式
装饰者(Decorator)模式参考:廖雪峰的博客
介绍类型:结构型模式。
定义:在不改变原有对象的基础上,将功能附加到对象上。
优势:提供了比集成更有弹性的替代方案(扩展原有对象功能)。
整体UML类图
代码中使用1234567891011121314151617//先定义一个“具体构件”实例 ConcreteComponent concreteComponent = new ConcreteComponent(); //定义具体装饰者类,并传入“具体构件实例” DecoratorAImpl A = new DecoratorAImpl(concreteComponent); DecoratorBImpl B = new DecoratorBImpl(concreteComponent); //调用具体的“装饰者类”的方法,可以实现额外功能。 // 具体的功能实现些在DecoratorAImpl/DecoratorBImpl中 A.operation();//A有附加功能a B.operation();/ ...