- 博客(91)
- 资源 (8)
- 问答 (2)
- 收藏
- 关注
原创 Flutter视图原理之StatefulWidget,InheritedWidget
对应的功能基本上都是在element中实现的,widget只是提供组件配置的作用,所以在讲解StatefulWidget,InheritedWidget的时候,主要还是分析对应的element的实现。通知子child的element需要重新build了,因为子child依赖了parent的数据,parent的数据发生变化的时候,是需要强制子child去重新build的。.新建了state,state的成员变量有element,widget都是私有成员,这个时候state的生命周期应该是created的,
2023-10-19 17:48:44 1185
原创 Flutter视图原理之三棵树的建立过程
上面梳理了整个树创建的过程,调用链:updateChild -> inflateWidget -> mount -> performRebuild -> (child -> updateChild递归调用)),],
2023-10-18 21:41:25 917
原创 Flutter之Widget生命周期
生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情,flutter中的。
2023-10-18 15:20:17 661
原创 Java线程池原理解析
ThreadPoolExecutor执行execute方法分下面 4 种情况。如果当前运行的线程少于 corePoolSize,则创建新线程来执行任务,这一步骤需要获取全局锁。如果运行的线程等于或多于 corePoolSize,则将任务加入 BlockingQueue。如果队列已满,则创建新的线程来处理任务 ,这一步骤需要获取全局锁。如果创建新线程将使当前运行的线程超出 maximumPoolSize,任务将被拒绝,并执行拒绝策略。
2023-10-11 19:01:33 180
原创 kotlin coroutine源码解析之Dispatchers协程调度器
1. Dispatchers的四种调度器是饿汉式单例对象,所以一个进程只存在一个实例对象。2. Dispatchers的四种调度器中,IO和default是共用的一个线程池,它的实现是CoroutineScheduler。3. CoroutineScheduler线程池,有一个保存线程的队列,有两种全局任务队列:一个是IO阻塞型队列,一个是cpu密集型任务队列;Worker线程拥有一个本地任务队列。
2022-11-20 16:41:21 2019
原创 kotlin coroutine源码解析之suspend挂起函数原理
1. 父JobA的lambda表达式中有挂起函数,协程会在父JobA的挂起点处创建一个CancellableContinuationImpl类型的continuation,这个Cancellable会和父JobA进行父子关联;如果挂起函数本身是某个JobB的挂机函数,那么Cancellable还会和JobB组成父子关系,JobB在结束自己的时候,会通知Cancellable自己完成了,Cancellable又会继续通知JobA继续执行lambda的代码块,这样JobA就从挂起点恢复过来了。
2022-11-17 11:49:36 1482
原创 kotlin coroutine源码解析之Job取消以及异常的处理流程分析
异常的传导链,从子Job向父Job传导:如果父Job是supervisorJob的话,将不做处理,需要子Job自己处理;如果父Job是JobSupport的话,异常还会继续向父Job的父Job传递,直到根部Job。所以捕获异常的话在根ScopeCoroutine里面设置就比较合适,对于有supervisorJob的情况,需要在supervisorJob的子Job中设置异常处理器,supervisorJob自己不会处理异常。
2022-11-16 00:10:41 1639
原创 kotlin coroutine源码解析之Job启动流程
dispatcher调用的是DIspatchedTask.run方法,(dispatcher是一个线程池和java线程池类似,但是有一点区别,后面章节再讲),run方法中,首先获取delegate,然后取出continuation变量,这个delegate其实是被DispatchedContinuation覆写的,而且实现的Continuation接口被构造函数的continuation代理,这个入参continuation其实就是ContinuationImpl,上一步分析过了。
2022-11-13 20:49:54 730
原创 kotlin coroutine源码解析之coroutineContext篇
表示一个元素或者是元素集合的接口。它有一个Key(索引)的Element实例集合,每一个Element的实例也是一个CoroutineContext,即集合中每个元素也是集合。
2022-11-06 16:51:47 1046
原创 红黑树的删除(下篇)
红黑树插入操作类似,红黑树的删除操作也是通过 重新着色(recoloring) 和 旋转(rotation) 来保证每一次删除操作后依旧满足红黑树的属性的。
2022-09-24 19:36:43 247
原创 红黑树的定义(上篇)
每个节点都有一种颜色,不是红色就是黑色;树的根节点是黑色;树中不存在两个相邻的红色节点(红色节点的父节点和孩子节点中都不能含有红色节点);从任意节点出发到其任何后代节点的每条路径中包含的黑色节点的数量相同。注意:为了更好的进行插入和删除操作,我们将所以的叶子节点的左右孩子节点设置为黑色的null节点,即逻辑空节点,但是在代码遍历的时候可以访问到。
2022-09-24 16:57:38 1602
原创 二叉树前中后序遍历(非递归),搜索二叉树迭代器
二叉树前中后序遍历(非递归)递归方式在这就不列举了,这里使用栈的方式来进行前中后序遍历二叉树。前,中序遍历中序:使用一个栈,从根节点出发,1.将左节点压入栈中,head = head,left继续迭代,不断迭代直到左节点为空。2.然后将stack栈顶元素pop出来存在head中,打印head,3.将head = head.right,重复以上1,2。写出的代码如下: public List<Integer> inorderTraversal(TreeNode root) {
2022-03-22 01:10:25 3088
原创 recyclerView吸顶悬浮标题(点击,折叠),itemDecoration实现
recyclerView设置悬浮标题方案了解ItemDecoration利用ItemDecoration来绘制悬浮标题栏代码方案1.设置一个悬浮的视图挂在recycleView顶部,随着item的移动位置,悬浮标题自动跟随移动或者是保持原地不动。2.使用recyclerView的ItemDecoration,给指定的item设置不同的itemDecoration,并且跟随item的移动而移动或者保持不变。本文采用第二种方式实现,效果图:了解ItemDecoration这是个接口,一共有六个方法
2022-02-07 23:45:56 3233
原创 字符串匹配(BF算法,KMP算法)
最近刷leetcode,刷到了字符串匹配算法,算法链接:实现strtStr()1.BF算法一开始解决这题的基本思想就是暴力匹配了,也就是BF算法,主串A,模式串B、对A串从头遍历到尾,每个位置都和B串进行一一比对,有一个位置不等,那么遍历A串的下一个位置,直到A串中字串有和B相等的或者A串遍历到尾部了就结束。实现代码如下: public int strStr(String haystack, String needle) { if (needle == null || needl
2021-12-23 18:28:07 913
原创 微信公众平台授权流程分析
微信授权流程分析什么是openId,unionIdopenid是某个公众号与对应粉丝账号相关联的唯一ID,unionId个人主体或企业主体账号与粉丝账号相关联的唯一ID,下属的所有公众号都可以用这个unionId类关联对应特定粉丝用户。这就好比unionID是用户万达企业的会员号,openId是万达旗下的子品牌的会员号,那么unionId就可以在子品牌下面通用的,不需要openId了。授权流程微信公众号平台用户授权流程如上图所示。这些过程从返回code之后,可以让后台服务器自己去实现,也可以使用微
2020-09-02 18:50:46 2339 1
原创 安卓Loop机制剖析之Looper,handler
目录Looper是什么简单使用从源码了解loop原理myLooper()next()handler.dispatchMessagehandler分析消息入队同步屏障Looper是什么用于为线程运行消息循环的类。默认情况下,线程没有与之关联的消息循环。要创建一个,在要运行循环的线程中调用 prepare(),然后调用loop()让它处理消息,直到循环停止为止。与消息循环的大多数交互是通过 Handler类进行的。意思大概就是让线程有处理消息的能力,并且这种能力是无限循环的,直到被停止为止。简单使用
2020-08-29 21:44:28 1530
原创 安卓Loop机制剖析之ThreadLocal
ThreadLocal是什么ThreadLocal是Thread的局部变量,用于编多线程程序,对解决多线程程序的并发问题有一定的启示作用,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路,使用这个工具类可以很简洁地编写出优美的多线程程序。简单使用解释其实还是很抽象的,下面展示一个demo,来看下threadLocal对象怎么使用的。 public void threadLocal(){ final ThreadLocal<String> t=new Thread
2020-08-29 18:02:54 408
原创 Okio基本使用以及源码分析
Okio是什么在OkHttp的源码中经常能看到Okio的身影,所以单独拿出来学习一下,作为OkHttp的低层IO库,Okio确实比传统的java输入输出流读写更加方便高效。Okio补充了java.io和java.nio的不足,使访问、存储和处理数据更加容易,它起初只是作为OKHttp的一个组件,现在你可以独立的使用它来解决一些IO问题。先看下okio库中类之间的关系:okio中最关键的是对于缓存队列的管理,这些优化操作使得okio在复制数据的时候可以减少拷贝次数,来看下okio中数据保存的数据结构是
2020-08-24 01:24:00 688
原创 从源码剖析RxJava基本工作原理(4),Schedule调度器的实现
Schedule调度器rxJava的调度器还是比较复杂的,继承关系比较复杂不说,而且有很多内部类,绕来绕去的有点恶心。但是嘛,先把图画出来再说,跟着图的路线走,总不会迷路的。首先我们使用的schedule的方式就是.subscribeOn(Schedulers.io()) 那么就从这个IO()函数入口去看下,里面是个什么东西, @NonNull public static Scheduler io() { return RxJavaPlugins.onIoScheduler(IO);
2020-08-20 17:26:05 431
原创 FutureTask的使用以及源码剖析
FutureTask类图我们首先来画一下类图,好分析这个类的逻辑流程以及功能:从图中可以知道,它继承了runnable接口以及future接口,那么说明这个类可以用来执行线程的异步任务,也可以用来将异步结果同步接受。 public static void main() { ExecutorService executor = Executors.newCachedThreadPool(); Task task = new Task(); Future
2020-08-19 15:35:06 219
原创 从源码剖析RxJava基本工作原理(3)
subscribeOn操作符上一节我们分析了observerOn操作符,它是可以切换onNext,onComplete所在线程的,也就是事件消费的线程;这一节我们来分析subscribeOn操作符,这个操作符是用来切换createEmitter类的subscribe方法的线程的,也就是切换事件发射所在的线程。demo实例按照惯例还是用一个demo代码来说明我们的subscribeOn操作符的作用以及用法。代码如下: Log.e(TAG,"主线程ID:"+Thread.currentT
2020-08-18 17:58:32 166
原创 从源码剖析RxJava基本工作原理(2)
RxJava线程切换我们知道使用rxJava的最重要使用场景就是获取网络请求数据或者是数据库数据等等异步耗时操作的,所以对rxJava线程切换的掌握也十分重要,这一章我们来讲一讲rxJava的线程切换是怎么实现的。简单demo使用 Log.e(TAG,"主线程ID:"+Thread.currentThread().getId()); Observable.create(new ObservableOnSubscribe<Integer>() {
2020-08-17 11:11:42 188
原创 从源码剖析RxJava基本工作原理(1)
什么是RxjavaReactiveX是一个通过使用可观察序列来编写异步和基于事件的程序的库。它扩展了观察者模式以支持数据和/或事件序列,并增加了运算符,使您可以声明性地组合序列,同时抽象出对低级线程,同步,线程安全性,并发数据结构和非线程等事物的关注阻塞I / O1.简单实例以上文字的描述很精炼的说出了rxJava是干啥的,以及它的优点,下面我会从简单的使用案例中去剖析rxJava的工作原理。Observable.create(new ObservableOnSubscribe<Intege
2020-08-15 21:28:42 246
原创 从源码分析Dialog,PopWindow为啥需要用activity的context创建,而不能用application。
目录欢迎使用Markdown编辑器Dialog的创建Dialog的show方法WMS对应窗口的管理如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器先来一张图展示,activity的结构和内容。可知 activity,phoneWindow,
2020-07-17 15:56:39 989
原创 安卓frame层异常错误排查
今天countly平台上出现了bug错误,日志如下:java.lang.RuntimeException: Unable to start activity ComponentInfo{cn.com.egova.egovamobile/cn.com.egova.egovamobile.media.CameraActivity}: android.view.InflateException: Binary XML file line #324: Error inflating class cn.com.eg
2020-06-01 19:21:00 2260
原创 VUE :class 动态class方法
操作元素的 class 列表和内联样式是数据绑定的一个常见需求。因为它们都是属性,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可。不过,字符串拼接麻烦且易错。因此,在将 v-bind 用于 class 和 style 时,Vue.js 做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组。vue官方文档对于class和style绑定有两种方法,对象语法...
2020-03-27 17:59:02 62554 4
原创 ConstraintLayout以及FlexBoxLayout使用,布局性能测试工具
ConstraintLayout布局以及性能测试约束布局的布局方式constranitLayout布局内视图的方位介绍1 相对定位<TextView android:id="@+id/TextView1" .../><TextView android:id="@+id/TextView2" ... app:layout_co...
2019-11-21 16:09:59 1223 1
原创 单台电脑配置多个git账号
假设现在你已经配置了一个账号在电脑上,现在开始配置第二个账号。分为三步:1.生成一个ssh_Key: 在生成密钥的时候进行文件命名,避免重复覆盖原来的key.2.将新生成的key添加到git账号中。...
2019-08-21 21:17:58 142
原创 GitHub常见问题解决
github连接报 “ssh: connect to host github.com port 22: Connection timed out” 错误这个是github服务器的问题,端口连接超时,那么可以修改端口解决问题。在.ssh文件夹下新建config文件。文件内填上如下内容:Host github.comUser XX账号@qq.comHostname ssh.github....
2019-03-31 10:01:10 1509
原创 关于recycleview内部嵌套expandlistview的问题
1.expandlistview的高度不能铺满到recycleview的item中,就需要重写expandlistview的onmeasure方法:@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 解决显示不全的问题 int expand...
2019-03-14 16:56:55 627
原创 安卓8.0以上系统的通知栏适配
安卓8.0以上系统的通知栏适配安卓的通知栏在发展过程中,主要经历了三个阶段,安卓3.0以下——>安卓3.0到安卓8.0以下——>安卓8.0以上。在3.0之前创建通知栏也很简单 NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_...
2018-11-16 18:19:08 643
原创 compileSdkVersion,targetSdkVersion和minSdkVersion三者的关系
**compileSdkVersion,targetSdkVersion和minSdkVersion***compileSdkVersion*定义应用程序编译选择哪个Android SDK版本,通常compileSDKVersion属性值被设置为最新的API版本,例如:25,改变compileSDKVersion的属性值不会影响Android系统运行行为,比如说,将属性值设...
2018-07-30 16:13:29 13997 1
原创 Android studio 3+版本解决gradle的疑难杂症
新建项目就出错。 报 appt 插件错误 在该文件中配置: 然后把 gradle版本降低到3.0.1gradle插件和gradle build tool版本对应规则如下:
2018-07-30 11:13:08 1415
原创 js和java交互
没什么要说的,就是在java调用js函数的时候出现没有反应的情况,最后发现问题是,java调用js的代码需要在主线程中执行,所以用handle.post之后就可以执行了。...
2018-07-05 20:34:44 1122
原创 适配安卓(Android)7.0文件系统
注: 安卓6.0是权限管理的变更,要想使用危险权限,必须代码中主动请求相关权限;到了安卓7.0中,即使你主动请求了读写权限,你不一定能够读取你想要的文件,因为7.0的文件系统加密了,使用方式和以前不同了,如果app不能即使的兼容7.0的新特性,很可能会导致应用崩溃。安卓7.0文件系统应用程序通常需要将其一个或多个文件提供给其他应用程序。例如,图片库可能希望为图像编辑人员提供文件,或者...
2018-06-03 12:45:07 1891
原创 css常用布局的坑
flex布局的用法,详情见:点击这里在这里写一下使用flex布局的心得,它和float流失布局不一样,使用它基本上可以只用一个层级就可以完成所有的布局,因为他是自起始端到末端,线性布局,可以设置自动换行和线性的方向。flex布局设置了wrap(自动换行),它的子view如果需要主动换行的话,可以设置子view的寛或者高是100%,这样后面紧跟着的子view就会自动换行,另起一行。如果一...
2018-05-07 17:55:43 499
原创 微信小程序自定义组件TabLayout(类似于今日头条的滑动菜单)
有了安卓开发经验,自定义微信小程序组件简直易如反掌。 自定义微信小程序的步骤如下:建立四个文件 分别是逻辑控制js,配置文件json,布局文件wxml,样式文件wxss。配置文件.json的编写 component参数:说明这个文件夹是组件文件夹; usingComponents参数:说明该组件是依赖于什么组件的,这里是空的什么都不依赖。.wxml文件...
2018-05-07 14:47:09 3902
原创 android组件化打包module遇到的问题总结(打包成aar)
在一开始接触APICLoud平台的时候我是拒绝的,因为对于一个有着熟练的java技能,掌握着老旧设计模式的人来说,这种平台简直就是对于程序员这个职业的侮辱。第一个原因是APICLoud平台剥离了原生开发和html+js开发的职责,使得原生开发的职业方向越来越窄,开发中的地位也逐渐下降;第二个原因是,这个平台完全是无脑式开发,所有的js框架都是封装好的,只需要像jQuery一样直接调用就好了,API...
2018-04-28 11:36:24 14566
微信小程序demo
2018-05-07
基于openCV的人体动作跟踪系统(C++)
2015-08-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人