自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

BATTERIA

Life is Like Gentle Water.

  • 博客(57)
  • 收藏
  • 关注

原创 Android自定义Lint检查-CustomLint

仓库地址背景1、大多代码规范都浮于表面,全靠开发自觉和Code Review来保障导致很多遗留的老大难问题。2、基础模块很多规范只能通过注释或者文档来约束。相关文档安卓自定义lint实现LintOption 文档AS Lint支持设计目标开发自定义Lint规则,通过Android Studio提供的Inspections实时检测代码,对不规范的代码进行实时提示。能够实时进行代码规范提示 实现仅对单个模块生效 可以控制提示等级 不增加包体积 不占用过多的系统内存

2020-12-10 12:37:14 752

原创 解决github中README图片无法展示问题

一、无法获取图片问题解决看到上图的异常就头疼,其实只要修改一下host就可以访问了。(安装一个SwitchHosts!)原因是raw.githubusercontent.com这个域名时不时会出现DNS污染问题。# github199.232.68.133 raw.githubusercontent.com199.232.68.133 githubusercontent.com二、引用方法选择1、使用绝对路径的地址可能一开始可以成功,但是只要github路径..

2020-12-10 12:01:38 711

原创 数字 1 的个数-耐心记录思路

解法一:思考每一位为1时有多少个数。遍历每一位,分三种情况讨论:1、当前位的数大于1时当前位取1时的所有范围内数的个数=该位左侧的可选数*该位右侧的可选数此时左侧的可选数是包含0的,例如n=21345,当前位为3,左侧的数为21,左侧的可选数即为21+1右侧的可选数每位都可以选0-9,则总计为10的(右侧位数)次方,21345的例子中右侧的可选数就为10的平方2、当前位的数等于0时和第一种情况类似,但是此时左侧的可选数是不包含0的。例如n=21345,当前位为3,左侧的数为21,..

2020-11-25 10:41:37 296

原创 参加考试的最大学生数-耐心记录思路

1349. 参加考试的最大学生数https://leetcode-cn.com/problems/maximum-students-taking-exam/给你一个m* n的矩阵 seats表示教室中的座位分布。如果座位是坏的(不可用),就用'#'表示;否则,用'.'表示。学生可以看到左侧、右侧、左上、右上这四个方向上紧邻他的学生的答卷,但是看不到直接坐在他前面或者后面的学生的答卷。请你计算并返回该考场可以容纳的一起参加考试且无法作弊的最大学生人数。学生必须坐在状况良好的座位...

2020-11-13 22:53:32 207 1

原创 PopupWindow崩溃处理记录

一、Attempt to read from field 'int android.view.ViewGroup$LayoutParams.width' on a null object referencejava.lang.NullPointerExceptionAttempt to read from field 'int android.view.ViewGroup$LayoutParams.width' on a null object reference崩溃堆栈:机型统计:

2020-11-11 16:05:16 824

原创 Flutter build-runner工具简单使用

build_runner提供了一些用于生成文件的通用命令,这些命令中有的可以用于测试生成的文件,有的可以用于对外提供这些生成的文件以及它们的源代码。如果你开发的是 Web :你可以使用webdev 工具替代 build_runner 以构建和提供 Web 应用。build SummaryGet Startpubspec.yaml添加依赖dependencies: flutter: sdk: flutter build_runner: anybuild.ya...

2020-09-21 12:31:43 5014

原创 Ansible自动化配置Flutter环境

安装:python>2.6brew install ansiblebrew install http://git.io/sshpass.rbansible --versionhostsall: children: servers: hosts: 10.23.2.147: ansible_ssh_user: xxxx ansible_ssh_pass: "xxxx123" .

2020-09-21 12:22:03 109

原创 MacDown+Mathpix Markdown高效编辑数学公式 支持LaTex语法

官网安装相关软件MacDown-高效编辑Markdown支持pdf输出https://macdown.uranusjr.com/Mathpix-截图扫描数学公式、支持LaTex排版语法https://mathpix.com/Mathpix使用截图设置MacDown支持Tex数学语法MacDown编辑数学公式使用范例...

2020-09-21 12:17:29 354

原创 Flutter-Dart var、dynamic、object区别

var、dynamic、object区别var在第一次赋值时确定类型,编译时就会转型object是所有类型的父类,可以随便指定引用dynamic是运行时才会确定类型,所以编译时无法发现错误;也因此方便实现动态代理...

2020-09-21 12:13:00 674

原创 Flutter-stream流 响应式编程简单应用

Stream流是Flutter对响应式编程的一种实现。创建StreamController(Stream的控制器)/// 使用broadcast构造产生的Stream可以被多次监听final streamController = StreamController.broadcast();// final streamController = StreamController();streamController.cancel();使用StreamController创建Streamfin

2020-09-21 12:12:09 318

原创 Dart-线程模型、isolate开启多线程方法

线程模型Dart 在单线程中是以消息循环机制来运行的,其中包含两个任务队列,一个是“微任务队列” microtask queue,另一个叫做“事件队列” event queue。从图中可以发现,微任务队列的执行优先级高于事件队列。现在我们来介绍一下Dart线程运行过程,如上图中所示,入口函数 main() 执行完后,消息循环机制便启动了。首先会按照先进先出的顺序逐个执行微任务队列中的任务,事件任务执行完毕后程序便会退出,但是,在事件任务执行的过程中也可以插入新的微任务和事件任务,在这种情况下,整个线

2020-09-21 11:58:16 1560 1

原创 Flutter-中文无法使用TextAlign.center居中

中文无法使用TextAlign.center居中目前解决方案 使用Baseline微调问题 在不一样的设备上效果有差异,Baseline不是很确定issues表意字符无法居中现已修复,使用新版本flutter不再出现该问题More info: CSDN...

2020-09-18 11:28:20 1583

原创 算法-字符串相关算法合集

字符串相加fun addStrings(num1: String, num2: String): String { val l1 = num1.length val l2 = num2.length var i = l1 - 1 var j = l2 - 1 var signal = 0 var result = "" while (i >= 0 || j >= 0 || signal == 1) { val n1 .

2020-09-18 11:27:14 206

原创 Flutter-布局的树结构分析

Flutter布局的树结构flutter中有三棵树,分别是Widget树、Element树、RenderObject树。其中Widget中只存放基本的配置信息,可以当作就是一个数据结构,而RenderObject是实际渲染使用的,layout和paint等操作都是RenderObject完成的。Element则是存放上下文的,同时持有Widget和RenderObject,并且负责处理state的状态变化。State的生命周期[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(

2020-09-18 11:25:51 1323

原创 算法-链表问题记录

链表相加 class ListNode(var `val`: Int) { var next: ListNode? = null } fun addTwoNumbers(l1: ListNode?, l2: ListNode?): ListNode? { var list1 = l1 var list2 = l2 val result = list1 var signal = 0 .

2020-09-18 11:24:46 82

原创 Flutter-性能优化方法与工具

性能优化分析与优化打开帧率检测[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TDGJHUWE-1600399314679)(/images/performance.jpg)]分析GPU、UI线程爆红的原因UI报红:执行了耗时的工作、算法复杂度过高GPU报红:绘制的图形过于复杂、执行了过多的GPU操作优化方法调整耗时代码的调用时机不要全局刷新使用独立的isolate处理过于耗时的算法多级缓存策略内存优化策略优化图片质量和尺寸在调用频率很高的方法中创

2020-09-18 11:22:31 390

原创 Dart-对比Java理解Dart虚拟机内存结构

Dart内存GC方法GC对比Java GCDart和Java的垃圾回收机制一样,都是分成了新生代和老生代,新创建的对象都会先分配在新生代中。然而Dart和Java的新生代内存分配方式不一样,Dart只分了from和to 1:1的两部分,而Java则是分成了Eden、FromSpace、ToSpace 8:1:1三部分。Dart中当from和to其中的一个内存占满则会通过gc将幸存的对象转移到另一个区域内,并将前一个区域清空,当经历了一定次数的gc仍然存活的,会被分配到老生代中。 老年代采用标记整

2020-09-18 11:21:23 933

原创 Flutter-深入理解flutter手势分发过程与相关Api

PointerPointer Event指针事件是指最原始的触摸事件,一次事件包括触摸到屏幕、在屏幕上移动到离开屏幕。使用Listener组件来监听指针事件,基本的回调有onPointerDown、onPointerMove、onPointerUp。Listener( child: Container( alignment: Alignment.center, color: Colors.blue, width: 100, height: 100, ),

2020-09-18 11:20:13 352

原创 Flutter Web-调研与简单应用

Flutter WebFlutter 1.9 稳定版正式将独立的 Flutter for web 仓库集成到 Flutter 的主仓库中。Flutter 1.12 稳定版提供了改进的 Web 支持,但仍是beta版,不建议商用。目前Flutter Web仍面临包体积大、性能差、资源缺乏等许多问题。案例Flutter Widget LivebookPanacheRivetKENKEN 益智游戏基本实现[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-di1Xc

2020-09-18 11:18:55 611

原创 Kotlin-对范型的理解、对比Java

泛型的意义泛型(参数化类型)代码复用。多种类型执行相同代码类型安全,编译器检查类型。泛型的类型在使用时指定,不需要强转。通配符超类型下界限定符? super T 指定类型参数的下限(该类型必须是类型T或者它的父类型)= in子类型上界限定符? extends T 指定类型参数的上限(该类型必须是类型T或者它的子类型) = out无界通配符 ?在Kotlin中强调了生产消费的概念,in是消费,out是生产。// 逆变interface Consumer<in T> {

2020-09-18 11:17:28 90

原创 Kotlin-内联相关问题inline、noinline、reified、crossinline

inline意义:函数在运行时都会生成一个对象,很多的小函数意味着额外的开销,使用内联函数则会在编译时进行优化。// examplelock(l) { foo() }inline fun <T> lock(lock: Lock, body: () -> T): T {...}// generatel.lock()try { foo()}finally { l.unlock()}noinline如果希望只内联一部分传给内联函数的 lambda

2020-09-18 11:13:41 369

原创 Java外部类内存泄漏问题

看到网上有一个有趣的提问:Android在使用Handler通信的时候,发现例如在runOnUiThread中修改了外部类的控件,而activity被销毁了,那runOnUiThread调用控件时会不会发生空指针异常?后来进行思考得出如下结论:匿名内部类持有外部类的对象,在内部类没有被回收之前,外部类不会被回收,因为和内部类关联。所以就算activity被关闭了,生命周期全部走完,也不会被...

2019-03-22 18:52:29 202

原创 关于ContentProvider

一、ContentProvider的基本使用及原理实现ContentProvider接口,并在AndroidManifest中注册它,设定特定URl。创建ContentResolver对象,使用相应URI调用ContentProvider中的相应方法。二、注册在xml文件中声明进程启动->Activitythread.main->ActivityThread....

2019-03-20 11:31:15 184

原创 关于BroadcastReceiver

一、BroadcastReceiver的基本使用原理使用观察者模式,发送者通过IPC向AMS发送广播,接收者通过IPC向AMS注册,AMS会根据发送者的要求寻找合适的接受者通过IPC发送广播,接收者在消息循环中解决接收到的广播。注册接收者分动态注册和静态注册,静态注册在AndroidManifest中使用<receiver>标签注册,动态注册推荐在Activity的onResu...

2019-03-20 10:07:01 178

原创 Android消息机制详解

一、ThreadLocal功能:对某些线程间共享的对象,对其建立副本,防止多线程并发冲突。实现方法:1.在Thread类中存在ThreadLocal.ThreadLocalMap对象,key是ThreadLocal对象,value是T副本对象。2.实例化ThreadLocal对象,调用set(T)方法,会自动获取当前Thread存到当前线程ThreadLocal.ThreadLoc...

2019-03-14 14:37:13 84

原创 Git基础与应用

初始化git仓库创建一个仓库目录 cd CODEBASE git init git add . git commit -m “MESSAGE”git全局参数配置git config --global user.name “”git config --global user.email “@”git config --global core.editor subl...

2019-03-13 10:20:03 99

原创 剑指offer--数组中的逆序对

题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 解析这道题就是计算数组的逆序数,在线代中学过这个概念,其实逆序数就等于冒泡排序的交换次数,可以从两者的概念中得知这一点。搞懂了归并排序这道题就简单了。下面的链接是讲归并...

2018-10-07 20:47:36 100

原创 剑指offer--字符串的排列

题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解析这一题要用到全排列,我直接对原字符串进行了全排列,然后再排序去重即可。1.全排列的原理很简单,就是每次从数组中取走一个元素,...

2018-10-07 11:23:16 110

原创 二叉树的三种非递归遍历整理

前序遍历void preOrder(TreeNode* p){ if(!p)return; TreeNode* t; t = p; stack&lt;TreeNode*&gt; nodes; nodes.push(t); while(!nodes.empty()){ t = nodes.top(); nodes....

2018-10-06 21:15:16 332

原创 剑指offer--二叉搜索树与双向链表

题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 解析我这个是不想动脑子的办法,最好还是在递归的过程中就完成指针的调整。void method(TreeNode* p, vector&lt;TreeNode*&gt; &amp;temp){ if(p){ method(p-&gt...

2018-10-06 20:49:36 94

原创 层次遍历数组建立二叉树

层次遍历数组建立二叉树约定:层次遍历数组中为空的结点记为0解析使用递归,检查每个结点的左右结点是否存在,存在即分配结点,并递归检查该结点。void insert(TreeNode *p, vector&lt;int&gt; temp, int t){ int length = temp.size(); if(t&gt;=length)return; p-&...

2018-10-06 11:26:06 6477 2

原创 剑指offer--二叉树中和为某一值的路径

题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 解析1.第一步,通过使用递归的深度优先遍历(DFS)将所有的根结点到叶子节点的路径放在二维数组结构中(vector&lt;vector&lt;int&gt;&gt;)。...

2018-10-06 11:15:22 276

原创 剑指offer--二叉搜索树的后序遍历序列

题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解析每次判断一个结点的左右子树是否左边全小于结点,右边全大于结点,然后递归判断两个子节点的情况。每次选择的节点都是后序遍历的最后一个结点,也就是根节点。class Solution {public: void method...

2018-10-04 20:02:45 84

原创 剑指offer--顺时针打印矩阵

题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 解析因为每顺时针打印一圈之后里面有时同样的情况,所以考虑使用递归来做。每次顺时针打印最外圈的数,再进...

2018-10-04 14:53:59 87

原创 剑指offer--树的子结构

题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解析1.本题我首先在pre1方法中对A树递归先序遍历寻找符合B树根结点的结点,2.然后在pre2方法中将上面求得的结点与B树一起进行递归先序遍历,若B树中有的结点,求得的结点的树中没有则返回false。若同时遍历到一个结点,但值不相同则返回false。若先序遍历完成后fla...

2018-10-03 22:58:14 401

原创 剑指offer--合并两个排序的链表

题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解析将两个链表排序插入vector数组中,再新建一条链表。这种方法需要新的空间,可以考虑将两个链表连起来,按数组顺序重新赋值,但是又会改变原来的两个链表,所以一开始的思路应该还行。class Solution {public: ListNode* Merge(ListNo...

2018-10-03 19:45:45 113

原创 剑指offer--反转链表

题目描述输入一个链表,反转链表后,输出新链表的表头。解析总是忘记边界值判断class Solution {public: ListNode* ReverseList(ListNode* pHead) { if(pHead==NULL)return NULL; if(pHead-&gt;next==NULL)return pHead; ...

2018-10-03 17:13:45 87

原创 剑指offer--链表中倒数第k个结点

题目描述输入一个链表,输出该链表中倒数第k个结点。解析可以先便利一遍求出链表总长,再遍历第二遍求出结点。或者定义两个指针,一个先遍历到第k个结点,再两个一起往后遍历,前一个为null时,后一个就是题目要求的结点。class Solution {public: ListNode* FindKthToTail(ListNode* pListHead, unsigned ...

2018-10-03 16:53:57 133

原创 剑指offer--二进制中1的个数

题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 解析使用位运算效率高很简单。int NumberOf1(int n) { //计算int二进制表示的位数 int length = sizeof(n) * 8; int sum = 0; for(int i=0;i&lt;length;++i){ if(...

2018-10-03 15:22:15 92

原创 Android线程学习----异步消息处理2

AsyncTask为了更加方便我们在子线程中对UI进行操作,Android还提供了另一个方便的工具--AsyncTask,Android为我们封装好了异步消息处理。使用实例直接掏出我在项目中实际使用的例子展现一下该接口的实际效果。@Overrideprotected void onResume() { super.onResume(); newMessagesT...

2018-10-03 11:31:16 116

空空如也

空空如也

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

TA关注的人

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