自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

原创 gradle打包问题总结

【代码】gradle解析pom文件,添加到指定pom中。

2023-04-30 20:46:18 768

原创 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

原创 红黑树的插入(中篇)

在一棵AVL树中,我们通过左旋和右旋来调整由于插入和删除所造成的不平衡问题。在红黑树中,可以使用两种方式进行平衡操作:

2022-09-24 19:25:27 430

原创 红黑树的定义(上篇)

每个节点都有一种颜色,不是红色就是黑色;树的根节点是黑色;树中不存在两个相邻的红色节点(红色节点的父节点和孩子节点中都不能含有红色节点);从任意节点出发到其任何后代节点的每条路径中包含的黑色节点的数量相同。注意:为了更好的进行插入和删除操作,我们将所以的叶子节点的左右孩子节点设置为黑色的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以下——&gt;安卓3.0到安卓8.0以下——&gt;安卓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

红黑树实现(java代码)

红黑树创建,插入,删除操作代码。包括创建,插入操作,删除操作,代码有详细的注释,java代码实现。

2022-10-07

NotifyInterceptor

本demo是拦截手机通知栏消息,然后上传到远程服务器的应用,远程服务器地址需要填写,本demo不提供。

2018-11-16

微信小程序(es6 promise封装)

微信小程序promise封装,包括微信小程序自带api进行promise封装

2018-06-08

微信小程序(自定义组件,模板,网络请求promise封装)

该微信小程序包括自定义组件,模板设计,网络请求promise的封装。

2018-05-23

微信小程序demo

该项目是微信小程序的demo,里面包含了模板(template),自定义组件(component),小程序数据请求的promise封装等等内容。是新手开发最好的代码例子。

2018-05-07

5种排序算法

五种算法代码,冒泡,归并,大堆,快速,插入。

2017-01-07

基于openCV的人体动作跟踪系统(C++)

基于openCV库,根据四肢,头部,躯干的质心跟踪人体进而模拟出人体动作,运主要用到的技术有模式匹配以及颜色识别技术。其他的还有一些图像处理方法。 对于新手来说非常好用,都有注释说明。自己修改main函数里面的视频路径为自己的视频路径。

2015-08-19

二叉树按层遍历

对于二叉树的按层系遍历算法,树采用静态数据存储,

2014-10-05

百度地图基本功能学习

选点:在地图上选择一点作为地址,定位,获取当前位置导航,路线规划:选择目的地进行导航。

2014-10-05

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除