- 博客(47)
- 收藏
- 关注
原创 Flutter的绘制流程简述
相对于React Native、Weex等跨平台框架,Flutter拥有自己的UI绘制体系,避免了React Native、Weex等跨平台框架与Native系统的桥接,从而更好的提升了性能。在Flutter中,UI都是一帧一帧的绘制,但这绘制的背后都会经过如下阶段。动画与微任务阶段,主要是处理动画及执行一系列微任务。构建阶段(build),找出标记为“脏”的节点与布局边界之间的所有节点,...
2019-11-25 21:28:09 1287
原创 Flutter之Widget大小与位置
在某些需求下,我们需要获取Widget的大小或位置信息。但Widget对象本身没有大小及位置数据,那么想要拿到Widget的大小及位置信息,就需要通过与Widget对象相关联的RenderBox对象来获取。下面就开始来获取Widget的大小与位置。1、获取RenderBox对象要想获取RenderBox对象,其实很简单。只需要调用BuildContext的findRenderObject方法...
2019-09-22 16:32:19 3887
原创 Dart之Mixin详解
随着Dart学习的深入,发现了一个比较棘手的语法——mixin。它对于Java开发人员来说,是一个全新的概念,但也是深入学习Dart无法绕过的一个槛。那么mixin到底是什么尼???下面来看维基百科对它的定义。mixin是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin类的方法、变量而不必成为其子类。简而言之,mixins是普通的类,我们可以从中扩展方法(或变量)而...
2019-08-19 21:08:51 10094 1
原创 Flutter之事件处理
在学习flutter的时候突然想到,flutter既然不像其他跨平台框架那样采用系统原生渲染,那么flutter就应该拥有自己的事件处理机制。本着好奇的心理,来对flutter的事件处理机制一窥究竟。1、flutter事件传递事件都是由硬件收集起来的,然后传递给软件。那么在flutter中,事件的源头在哪尼?经过分析源码可以发现。在类window中,flutter通过方法onPointerD...
2019-08-19 21:07:53 4303
原创 Flutter之Widget层级介绍
在flutter中,一切皆Widget。无论是显示界面的UI元素,如Text、Image、Icon等;还是功能性组件,如手势检测的GestureDetector组件、应用主题数据传递的Theme组件、移除系统组件自带Padding的MediaQuery组件等。可以说,flutter界面就是由一个个粒度非常细的Widget组合起来的。由于Widget是不可变的,所以当视图更新时,flutter会创...
2019-07-27 22:42:49 3304
原创 一篇看懂Android与Flutter之间的通信
在不得不看的Flutter与Android混合开发一文中讲述了Android项目如何导入flutter模块,但有一个问题,就是它们之间还不能互相通信,但这又是非常必要的。所以本文就来讲述一下Android如何与flutter进行通信。1、架构概述消息通过平台通道在native(host)与flutter(client)之间传递,如下图所示:为了确保用户界面能够正确响应,消息都是以异步的方式...
2019-06-25 17:29:38 2281 6
原创 不得不看的Flutter与Android混合开发
记得在flutter刚出来时,笔者就开始学习flutter。但由于当时嫌弃flutter复杂的层级组合且未推出稳定版,所以当时就放弃了深入学习,现如今随着flutter的蓬勃发展及大佬们的力推,就又入坑flutter。虽说flutter能够跨平台,但由于现在几乎都是现成的项目,所以不可能用flutter来重头开发,所以目前几乎都是采用native+flutter的混合开发方案。那么该方案该如何...
2019-06-16 09:26:18 6381 4
原创 RxJava详解
RxJava是ReactiveX推出的一个开源库,它是Reactive Extensions的Java VM实现,可以很方便的在Java中实现响应式编程。解决了Java中繁琐的异步切换、Callback hell等问题,使逻辑变得更加简洁。1、操作符RxJava提供了丰富&功能强大的操作符,可以说这些操作符就是RxJava的基础及核心,所以学习RxJava都是从这些操作符开始。但由于R...
2019-06-08 20:03:00 7139
原创 毛玻璃效果在Android的实现
本文已授权「玉刚说」微信公众号独家发布毛玻璃效果实际上是对原图片的严重劣化,突出朦胧感,一般都是通过图片的缩放+模糊算法来实现,从性能角度考虑,模糊半径不能大于25,所以要更高的模糊效果则需要进行缩放。具体实现方案有以下几种。Java实现,一般都是采用Stack模糊算法RenderScript实现Native实现OpenCV或者OpenGL实现,由于其复杂度,本文暂不讨论该方案关...
2019-03-20 11:11:43 9633 1
原创 骨架屏(Skeleton Screen)在Android中的应用
在如今获取用户成本越来越高的情况下,好的用户体验能够更好的留住用户。为了提升产品的用户体验,各种技术层出不穷,其中,尤以菊花图以及由它衍生各种加载动画最为突出。 对于菊花图,想必是又爱又恨吧,它是仿IOS的,在Android端实现有一点麻烦。而如今有了比菊花图设计体验更棒的方法,即大家常看到的Skeleton Screen Loading,中文叫做骨架屏。 那什么是骨架屏尼?它的语义如下:...
2019-02-28 18:36:19 7624
原创 OkHttp之工作流程
OkHttp是Square开源框架之一,想必大家对它都很熟悉。它有同步及异步两种请求方式,具体使用如下。 public static void main(String... args) throws Exception { OkHttpClient client = new OkHttpClient(); Request request = new Request.Build...
2019-02-23 19:34:56 487
原创 Android之ContentProvider源码解析
【参考资料】《Android艺术探索》[深入理解Android卷二 全文-第七章]深入理解ContentProvider从源码角度看ContentProvider
2019-01-29 12:43:11 828
原创 JVM之内存分配策略
对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓存,将按照线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,如大对象(需要大量连续内存空间的Java对象)直接进入老年代。 在这之前先来简单了解一下JVM的内存回收策略。当前虚拟机都采用了“分代收集”算法,此算法根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生...
2019-01-25 20:56:40 212
原创 Java之显示锁
在Java 1.5之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile。Java1.5增加了一种新的机制:ReentrantLock。但ReentrantLock并不是替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能。【参考资料】Java并发——显示锁java并发编程-线程同步-显示锁ReentrantLock不可不说的Jav...
2019-01-22 22:23:22 987 1
原创 Java之CAS无锁算法
如果一个线程失败或挂起不会导致其他线程也失败或挂起,那么这种算法就被称为非阻塞算法。而CAS就是一种有名的非阻塞算法实现,也是一项乐观锁技术。它能在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步,所以CAS也是一种无锁算法。 CAS包含了3个操作数——需要读写的内存位置V、进行比较的值A和拟写入的新值B。当且仅当V的值等于A时,CAS才会通过原子方式用新值B来更新V的值,否则不会执...
2019-01-21 18:23:13 2613 1
原创 linux之基本bash shell命令(一)
linux文件查找命令pwd:显示当前会话目录cd:跳转回主目录cd doc:跳转到doc目录 在相对路径文件中有两个特殊字符可以使用单点符(.),表示当前目录双点符(…),表示当前目录的父目录cd ../ffmpeg:跳转到当前目录的父目录下的FFmpeg目录cd ../../ffmpeg:跳转到当前目录的父目录的父目录下的FFmpeg目录linux文件和目录列表ls:显...
2019-01-10 20:36:06 330
原创 Glide源码(基于4.8版本)解析
Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在Android平台上以极度简单的方式加载和展示图片。 使用Glide来加载网络图片非常简单,通过Glide.with(this).load(url).init(imageView)这样的一句代码就可以搞定,虽然很简单,但是还是有必要了解...
2019-01-08 14:09:10 2424
原创 JVM之内存模型与线程
由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处理器之间的缓冲。 基于高度缓存的存储交互很好地解决了处理器与内存的速度矛盾,但也引入了一个新的问题:缓存一致性。在多处理系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存,如下图所示。当多个处理器的运算任务都涉及同一主内存区域是,将可能导...
2019-01-05 20:38:18 267
原创 Android之Service自启动流程
Service自动重启原理 无论Service是启动还是绑定成功后,都会调用ActiveServices的serviceDoneExecutingLocked方法,来看一下这个方法的实现。 void serviceDoneExecutingLocked(ServiceRecord r, int type, int startId, int res) { boolean i...
2019-01-04 15:51:30 3283
原创 RxJava源码分析
&esmp;关于RxJava的实例应用可以参考Android RxJava实际应用教学:你该什么时候使用RxJava?
2019-01-03 17:57:52 164
原创 Java之线程实现原理
并发不一定依赖多线程(如PHP中很常见的多进程并发),但在Java里谈并发,大多数都与线程脱不了关系。线程是一种比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和调度执行分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的基本单位)。1、线程的实现 Java提供了在不同硬件和操作系统平台下对线程操作的统一处理,每个已经执行start...
2018-12-31 23:46:52 250
原创 Java线程之线程池的使用
 用法具体实现newFixedThreadPoolExecutors.newFixedThreadPool(int)Executors.newFixedThreadPool(int,ThreadFactory)new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new Linke...
2018-12-31 17:57:33 169
原创 Android源码之Service启动流程
Service在开发中使用得或许没有activity那么频繁,但它是Android四大组件之一,在Android中也是十分重要的,前面分析了activity的启动流程,这里也来分析一下Service是如何启动的。 Service分为两种工作状态,一种是启动状态,主要用于执行后台计算;另外一种是绑定状态,主要用于其他组件与Service的交互。需要注意的是,Service的两种状态是可以共存的,...
2018-12-30 21:19:26 904
原创 RxJava之线程切换原理分析
Scheduler翻译成中文就是“调度”的意思,在RxJava里就是线程之间的调度,也就是线程之间的切换。在RxJava里默认有5种实现。 从图中可以简单看出,SingleScheduler、ComputationScheduler、IoScheduler、NewThreadScheduler的核心实现就是一个线程池,但该线程池里只会有一个线程,而newScheduledThreadPool...
2018-12-29 23:59:51 2576 2
原创 Java线程之线程池
Executor框架可以将任务的提交与任务的执行策略解耦开来。就像许多对复杂过程的解耦操作那样,这种论断多少有些言过其实了。虽然Executor框架为定制和修改执行策略提供了相当大的灵活性,但并非所有的任务都能适用所有的执行策略。有些类型的任务需要明确的指定执行策略。依赖性任务使用线程封闭机制的任务对相应时间敏感的任务使用ThreadLocal的任务大多数行为正确的任务...
2018-12-28 22:28:31 186
原创 Android源码分析之消息机制——Handler源码解析
Android的消息机制主要是指Handler的运行机制,Handler是Android消息机制上层接口的实现,它的运行需要Message、MessageQueue和Looper的支撑,下面就来分别介绍它们的实现原理。1、Message源码解析 首先来了解一下Message,它是消息的载体,Handler传递的消息必须按照Message格式来传递,实现了Parcelable接口,所以进程间通...
2018-12-26 12:23:59 272
原创 Android事件分发机制
@Override public boolean dispatchTouchEvent(MotionEvent ev) { if (mInputEventConsistencyVerifier != null) { mInputEventConsistencyVerifier.onTouchEvent(ev, 1); } ...
2018-12-26 12:23:35 175
原创 Android源码分析之LayoutInflater解析
参考Android LayoutInflater源码解析Android LayoutInflater源码解析:你真的能正确使用吗?
2018-12-21 15:10:06 262
原创 Android源码分析之Activity启动流程
activity的启动比较复杂,所以先上流程图,具体后面再慢慢梳理 无论是启动一个应用,还是新启动一个activity,都是调用Activity的startActivityForResult方法,默认requestCode为-1,也就是认requestCode为-1时没有返回值。 public void startActivityForResult(@RequiresPermissi...
2018-12-20 20:36:19 358
原创 Android源码分析之View绘制流程
在Android的知识体系中,View扮演着很重要的的角色,简单来理解,View就是Android在视觉上的呈现。在界面上Android提供了一套GUI库,里面有很多控件,但很多时候系统提供的控件都不能很好的满足我们的需求,这时候就需要自定义View了,但仅仅了解基本控件的使用是无法做出复杂的自定义控件的。为所有了更好的自定义View,就需要掌握View的底层工作原理,比如View的测量、布局以...
2018-12-20 18:34:49 550 2
原创 Android Binder的使用
Binder是一个深入的话题,由于Binder太过于复杂,所以本文不涉及底层细节,要想要知道底层细节可以去阅读写给 Android 应用工程师的 Binder 原理剖析、Android Bander设计与实现 - 设计篇这两篇文章。1、AIDL文件的创建及解析 Binder使用起来还是比较简单的,创建一个IBinderPool.aidl文件然后clean一下,就可以给我们生成一个Java文件...
2018-12-17 22:17:52 2688
原创 Java线程池之栅栏
通过闭锁来启动一组相关的操作,或者等待一组相关的操作结束。闭锁是一次性对象,一旦进入终止状态,就不能重置。 栅栏类似于闭锁,它能阻塞到一组线程到某个事件发生。栅栏于闭锁的关键区别在于,所有线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。栅栏用于实现一些协议,例如几个家庭决定在某个地方集合:”所有人6:00在麦当劳碰头,到了以后要等待其他人,之后再讨论下一步要做...
2018-12-17 14:33:46 1517
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人