自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 资源 (2)
  • 收藏
  • 关注

原创 IO优化:使用mmap使读取文件的效率提升

在wps Android端的日子过得很快,我所在的组是IO组。因为WPS需要大量的和文档打交道,所以有专门的组负责IO。最近想探索一下,是否可以把mmap接入到wps上。于是做了 “手写mmap进行读盘”的探索。这里说一句,因为java 层的MappedByteBuffer 虽然也是采用了mmap。但是我发现有一个缺点是没有提供unmap方法,很容易超过最大限制导致映射失败我不知道为什么很多博客说MappedByteBuffer效率会高,如果你有比较demo可以证明这一点,可以在评论一起交流。先说

2021-10-15 20:55:26 8943

原创 算法题十七 之 寻找循环递增数组的最小值

给一个循环递增数组,用最快的方式寻找出最小值例如:9,10,50,66,70,80,200,2000,-1,0,2,3,4,8 返回 -1。用二分法,只是二分的条件比较复杂,时间太紧,一开始想不出来这么优雅的代码,只是胡乱的二分。下面是我现在写出来的我认为比较好的代码 private int find(int[] arr) { if (arr == null) { return -1; } if (arr.length == 1) { return arr[0]; }

2021-09-28 10:44:23 529

原创 大师课笔记,持续更新~

一、 崩溃相关1、 收集Nativity异常,可采用 Breakpad 框架资料来源:https://mp.weixin.qq.com/s/g-WzYF3wWAljok1XjPoo7w?它的原理为:①:当应用崩溃时,Linux会抛出信号量(信号量是一种进程间的通信方式)②:内核会自动接收到信号量,并且通知进场进入内核态。③:当进程从内核态切换到用户态或者在内核态从睡眠状态被唤醒时,会检查信号量④:当检查到信号之后,会把内核栈的数据拷贝到用户栈上,并且在用户态下执行处理函数。⑤:所以,捕获Na

2021-07-12 00:58:01 131

原创 算法题十六 之 二叉树根节点到叶子节点的所有路径和

二叉树根节点到叶子节点的所有路径和题目:给定一个仅包含数字 0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。例如根节点到叶子节点的一条路径是1→2→3,那么这条路径就用 123 来代替。找出根节点到叶子节点的所有路径表示的数字之和例如:这颗二叉树一共有两条路径,根节点到叶子节点的路径 1→2 用数字 12 代替根节点到叶子节点的路径 1→3 用数字 13 代替所以答案为 12+13=25思路这道题很简单,只是我一开始思路想错了,并且在线上环境,不可以用IDEA,

2021-07-05 22:46:42 385 2

原创 Android的进程间通信(六)之 Binder的客户端发送数据到服务端的流程

上一篇文章,介绍了Binder 内核层的注册代码以及ServiceManager初始化的过程。而我们平时在使用进程间通信时,只需要关注的“客户端”,“服务端”等概念。今天,就让我们来看一下,我们平时在使用AIDL的背后,是如何涉及到Binder内核和ServiceManager的。AIDL的使用过程:第一:我们定义一个AIDL文件interface IAIDLService { void basicTypes(int anInt, long aLong, boolean aBoolean,

2020-12-29 11:23:38 824 1

原创 Android的进程间通信(五) 之 Binder内核层以及ServiceManager初始化流程

Linux系统中,有驱动的扩展接口。Google在Linux的基础,增加一个Binder驱动,也就是前面几讲一直在说binder“内核”。我们先来看一下Binder的内核注册的过程吧在binder的内核文件中,Linux系统会自动调用 binder_init 的初始化方法,在这个初始化函数中,有一个 misc_register(&binder_miscdev) 函数。misc_register 是一个系统级别的函数,而参数binder_miscdev是一个结构体。我们来看一下 &bind

2020-12-23 17:30:57 329 2

原创 Android的进程间通信(四) 之 Binder 通信模型 与 Linux的其他进程间通信对比

Binder 与 Linux的其他进程间通信对比Linux系统中,已经自带了很多进程间通信的方式了,例如:管道,信号量,共享内存,socket等等。我们在了解一个新东西的时候,要先知道,为什么需要这个东西?Android系统的开发工程师为什么要放弃已有的进程间通信方式不用而重新开发一个新的通信方式呢?Linux系统一般用于嵌入式系统,亦或是服务器中,在这类的应用场景中,进程与进程的通信其实相对而言是比较简单的。例如在服务器上,进程间通信主要用于自己写的应用间的通信,这个场景就比较适合用共享内存。但是

2020-10-13 11:23:00 469

原创 Android的进程间通信(三) 之 AIDL 通信 之AIDL使用方式与源码解析

AIDL使用方式与源码解析继上一篇博客,这一篇我们将要介绍AIDL的使用方式和源码解析。先来看官网对于AIDL的定义:Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似。您可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。简单来说,AIDL是一种接口语言,服务端和客户端可通过AIDL定义接口后,编译器会自动生成相应的java代码,二者可以进行IPC通信。如何使用?使用的步骤也很简单。第一步:新建AIDL文件

2020-10-09 15:00:22 466

原创 Android的进程间通信(二) 之 AIDL 通信 之 Messenger

Android 常见的几种进程间通信在Android中,存在着很多种进程间通信。一般而言,Activity之间、广播是通过Intent传输数据的。Service与Activity之间是通过AIDL。其他例如文件通信,用得比较少,实时性差。Intent 通信几乎和进程内通信的方式一样,没有什么特别之处。所以今天我们来梳理一下AIDL以及AIDL的封装messenger。用法预备知识:如何启动Service?启动Service有两种方式,一种是startService,一种是bindService

2020-10-09 11:28:51 314 2

原创 Android的进程间通信(一) 之 进程隔离简述

进程隔离简述我们在了解进程间通信的之前,其实要先思考一个问题:“为什么要进程间通信?”A进程无法访问B进程内存,B进程无法访问A进程的内存,进程和进程之前存在着进程间隔离。我们按照这个思路往下,马上可以有另外一个问题,为什么要有进程间隔离?进程间隔离,在维基百科上的主要介绍是:为了避免A进程写入B进程的情况发生。我们可以举一个例子:当在Android系统上运行着微信,假如不存在进程间隔离,那么其他App可以直接访问微信的内存,那么会存在我们用着用着微信,突然发现发出的消息被改变了,用着用着突然

2020-09-29 10:45:54 1500

原创 Android 性能优化 第一篇 之 应用启动时间优化

应用启动时间的重要性如果你是一名Android开发者,你应该可以发现,当你没有做启动优化去直接点开App,会有一小段时间是白屏或者黑屏(取决主题)。如果不针对这一小段时间做优化,那么给客户的用户体验是很差的,很有可能导致用户卸载App、在应用市场给差评。应用的两种启动方式冷启动冷启动是指应用从头开始启动,进程的创建是在冷启动后才开始创建的。一般是在设备第一次启动后点开App或者是应用被杀死之后重新点开App时,会发生冷启动。冷启动时系统一般有三个任务:加载并且启动应用应用启动

2020-09-16 17:16:10 531

原创 Android studio 一键国际化翻译插件最新版

最近做一款打印机App,因为主要是销向国外,所以需要国际化。 作为一款偷懒的程序员,叫我一个一个去网站翻译,那是不可能的,如果程序员没有一颗偷懒的心,那还叫程序员么?在网上百度,找到一款插件,叫做AndroidLocalizationer。但是这款插件早在两年前就已经停止维护,下载下来安装进去,也没有办法进行使用了。继续百度,又找到了一款,是后来有人在AndroidLocalizationer的基

2017-12-08 16:52:27 4466 6

原创 Android 源码分析之——Activity启动流程

Activity启动流程跟踪

2017-10-15 15:20:04 273

原创 八大排序实现与简单解析

在平时的开发过程中,需要用到排序的时候,都是调用java已经自带的接口。简单,高效和稳定,所以,我在这之前,都不懂得八大排序是哪八大排序。参加校园招聘后,才发现,排序的方面考得很多,于是又了这篇文章,算是一个学习记录。1、快速排序顾名思义,快速排序是快速的,它的时间复杂度是O(nlgn),速度那是相当的快。同时,快速排序所占用空间也很小,所以快速排序是又快同时占用的内存又少,所以是应用最广的一种排序

2017-09-03 10:41:29 319

原创 分析Android中Handle机制

上次浅分析了android中的绘画机制,今天我们来谈谈,android中的Handle机制。在一开始学习Android的时候,总会遇见一个问题,更新UI只能在主线程中进行,而有时候做耗时操作(耗时操作要在分线程中进行)后要去更新UI,就不可避免的用到了Handle。例如:class myThread extends Thread{ @Override public void run(

2017-08-06 14:59:56 400

原创 浅分析android绘画机制

上篇文章探讨了android事件分发机制,这一篇简单的介绍一下,android的绘画机制。首先,先写一个类继承于LinearLayout,并且重新相应的方法。 然后在使用这个布局,看看日志的输出。 所以,android的绘画顺序是 onMeasure –> onLayout –> onDraw 顾名思义,对应的是“测量”,“布局”,“绘制”。下面,咱们来按顺序一个一个来看。onMeas

2017-07-21 22:22:49 335

原创 源码分析android的事件分发机制

hollow,大家好。 从今天起,我给自己下了一个目标,一个星期写一篇技术文章,不为什么,只为了让自己能进步。 今天这篇技术文章,分析android的事件分发机制。事件分发机制事件分发机制会从最大的view节点往下传播事件,所以叫做事件分发机制。 先来看一组代码。myButton.setOnTouchListener(new View.OnTouchListener() {

2017-07-07 21:33:46 306

原创 算法题 十八 之 之 字型打印二叉树

一开始我的思路就是一层用队列打印,一层用栈打印。但是,后面发现与答案不符合,因为每一次打印都要从另外一个方向重新开始,唉。真的蠢,每一次都要从另外一个方向,用两个栈不就解决了吗?搞那么多事。 public void prinft(Node root) { Stack<Node> stack1 = new Stack<Node>(); Stack<Node> stack2 = new Stack<Node>();

2021-09-29 21:23:38 166

原创 循环线程打印

几个线程,循环打印1 - 100 public static void main(String[] args) throws UnsupportedEncodingException, InterruptedException { new Main().printfTo100(); } public boolean isStop = false; public class Model { private int count = 0;

2021-09-07 21:15:33 127

原创 什么?Volatile会造成死循环?假的

今天在系统的学习Volatile,看到一个例子,运行起来会死循环,而加了一个Volatile就不会,然后引出结论 ----- Volatile可以使线程回写主存。很多教学视频用这个例子来教学。我一看,不对劲。因为像例子里面的代码造成的死循环,在我几年的开发过程中,是没有遇到过的。其次,据我所知,在没有加Volatile的情况下,线程的内存不存在不回写的情况。之所以会线程不安全是因为线程的内存没有实时与主存同步,而加了Volatile可以保证线程可见性。来看死循环具体的实现代码:public clas

2021-08-15 14:54:41 296 1

原创 快速排序在排标兵时,为什么需要从基数的对面开始?

今天周末,复习了一下快速排序的实现。我在手写实现的过程中,基数取的是低指针的值,但是我在开始排标签时,先从左边的开始排,导致结果错了。我就很纳闷,为什么不可以从相同的方向开始排,一定要从基数的对面开始?于是乎我看了一下排序的过程,发现确实会发生数据错乱。我上网查了一下,绝大多数的回答都是同一篇,那篇回答也只是帮忙捋了一下排序的过程,然后证明不行。但是我感觉没有说到点上。我自己思索了很久,发现如果当排基数时,如果从相同方向开始,当第一个方向排完之后,排第一个方向时,基数的位置与要排的方向是相反的。如

2021-06-27 14:25:49 198

转载 Vivo免密码安装

1、安装vivo-app-debug.apk2、输入软件首页,输入你的vivo帐号的密码,键盘确认保存3、进入设置-搜索“辅助”-进入辅助功能-找到“vivo 免输入密码自动安装apk”-点击进行,并打开它4、设置app不被关闭,vivo多任务上锁1、点击左下角多任务栏2、找到上面安装的那个应用,右上角有一把小锁,点击一下即可锁定github仓库下载地址(apk下载地址)VivoAutoInstallAPKhttps://github.com/jianwuch/VivoAutoInstall

2021-05-10 21:16:13 5029

原创 ITMS-90424: Invalid Swift Support

在提交App到App store时,apple给我报了这个错误,我尝试了很多方法,例如:重写安装xCode,把Always Embed Swift Standard Libraries 设置为yes等等。最后在这个https://developer.apple.com/forums/thread/125902 网址找到一个解决方法。My work-around for this issue is:in Organizer after you create an archive, right-cli

2021-04-02 19:48:32 2008

原创 算法题十五 之 重构字符串

题目给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。若可行,输出任意可行的结果。若不可行,返回空字符串。注:S 只包含小写字母并且长度在[1, 500]区间内。例如:输入: S = “aab”输出: “aba”输入: S = “aaab”输出: “”思路一、像字符串的这种题,一般而言需要“桶的思想”。我们可以把26个小写字母,看成26个桶,每一个桶存着具体字母的大小。二、我们优先处理最大的那个桶,把这个桶的字符串与第二大桶的字符串互相消费。每一次消费都需要更新最大

2020-11-30 17:09:41 164

原创 算法题十四 之 判断是否是平衡二叉树

题目给你一个树,判断是否是平衡二叉树。平衡二叉树的定义:左右子树的高度相差不大于1思路很简单,我们只需要判断如下两点:递归调用判断左右子树的高度是否大于1,如果大于1,则不是平衡二叉树。满足第一点的同时,还需要判断左右子树是否同时也是平衡二叉树。很简单的一道题,理解树的遍历其实就很容易解决这样的题目了附上代码public boolean isBalanced(TreeNode root) { if(root == null){ return true;

2020-09-10 16:32:57 238 1

原创 算法题十三 之 图像渲染

题目leetcode 传送门我发现,原题描述很让人迷惑,把一道简简单单的题目故意说得很复杂。简单翻译一下有一个矩阵,宽高是 n 与 m这个矩阵里有颜色值,有一个数字表示现在给你一个点(sr,sc)和一个新的颜色值,让你把这个矩阵与点(sr,sc)直接与间接相连格子染成新的颜色值。判断相连的方式是 上 下 左 右思路从起点(sr,sc)开始深度遍历每次对比上下左右的颜色值是否与当前点一致如果一致,则递归调用如果不一致,则停止。附上代码public int[][] flood

2020-09-08 18:47:49 236

原创 算法题十二 之 有效的括号

题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。思路这道题目应该是应届生水平题目,我记得在大一时学习数据结构的时候,老师出过这样的题目,当年真的一脸懵逼,现在做起这样的题目,就很轻松了。本质是利用栈的先进后出的原理①,当遇到左括号时,都入栈。②,遇到右括号时,先判断栈是否为null,如果是null,说明当前右括号没有左括

2020-09-08 16:55:40 88

原创 算法题十一 之 两数相乘

题目给定两个只包含0 - 9 的字符串,输出两个字符串相乘的结果。要求:不可以直接把输入的字符串转化成整数思路因为不可以直接把输入字符串转化成正数,所以我们只能用代码实现一个位一位之间的相乘。每一个位相乘之后,把所有结果加起来,即是答案。根据第二点,我们还需要实现两数相加,因为虽然题目只是要求不可以把输入字符串直接转化正数,但是乘出来数字有可能非常的大,用基本数据类型可能也没有办法存。先实现两个数相加思路: 这其实是另外一道题目了,思路是从每个字符串的最高位开始,两两相加,然后 %

2020-09-08 16:32:24 839

原创 算法题 十 之 无向连接图的深度拷贝

题目无向连接图的深度拷贝图的表示方式,用数组表示与当前节点连接的节点,如下面的代码class Node { public int val; public List<Node> neighbors;}思路对于图片的拷贝,需要先掌握图的遍历,图的遍历可以使用深度与广度优先遍历。在这个题目里,我们采用深度优先遍历来解题。深度优先遍历递归调用各个节点。遍历的出口?我们在遍历循环图的时候,是采用标志位当前节点是否已经遍历过了,如果遍历过了就不再遍历,避免重复以及死循环

2020-09-08 15:32:07 639

原创 算法题九 之 被围绕的区域

题目给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。例如:X X X XX O O XX X O XX O X X输出:X X X XX X X XX X X XX O X X思路第一步:从题目的观察中可以得知,只要O与边界连接,这个O便不被包围。而与O这个连接的所有O,也都不被包围。第二步:根据第一步的观察,只要O通过连接链与边界产生关系,则当前O是不被包围,反之,则被包围。第三步:

2020-09-08 14:56:52 467

原创 算法题 八 之 腾讯笔试题 之 画家小Q

画家小Q画家小Q又开始他的艺术创作。小Q拿出了一块有NxM像素格的画板, 画板初始状态是空白的,用’X’表示。小Q有他独特的绘画技巧,每次小Q会选择一条斜线, 如果斜线的方向形如’/’,即斜率为1,小Q会选择这条斜线中的一段格子,都涂画为蓝色,用’B’表示;如果对角线的方向形如’’,即斜率为-1,小Q会选择这条斜线中的一段格子,都涂画为黄色,用’Y’表示。如果一个格子既被蓝色涂画过又被黄色涂画过,那么这个格子就会变成绿色,用’G’表示。小Q已经有想画出的作品的样子, 请你帮他计算一下他最少需要多少次

2020-09-03 10:59:11 371

原创 算法题 七 之 IP地址复原

题目给一个只包含数字的字符串,还原所有IP地址的可能性,IP地址的每个小段用“.”分开,每个小段除了0之外,其他不能以0开头,每个小段的不可以超过255。例如:输入:s = “25525511135”输出:[“255.255.11.135”,“255.255.111.35”]很简单的一道题目,很明显用 “递归” + “回溯” 算法即可解决。 递归的状态定义一个下标 index:表示在字符串里位置。定义一个临时数组,代表着当前的临时结果。每次进去递归窗口。需要做如下几个处理。第一:递归的出口,判

2020-08-25 10:49:23 346

原创 算法题 六 之 校验二叉树

题目:给定两颗二叉树,校验二颗二叉树是否一致。当二叉树的结构和每个节点的值都为一样时判定为一致。很简单的一道题,递归调用即可。附上代码;public boolean isSameTree(TreeNode p, TreeNode q) { // 判断结构 if(p == null && q == null){ return true; } if(p == null || q == null){ return false;

2020-08-24 20:32:25 109

原创 算法题 五 之 二叉树的最大权值

题目:一个二叉树,每个节点上都有权值,当父节点和子节点不能同时选中的前提下,二叉树的最大值。实例请看 :https://leetcode-cn.com/problems/house-robber-iii/解析:每个节点有两种状态,一种是选中当前节点的情况下,当前节点从下往上的最大权值。一种是没有选中当前节点的情况,当前节点从下往上的最大权值。所以 定义两个哈希表,一个存选中的情况的每个节点的最大值,一个存没选中情况下的每个节点的最大值。当节点是叶子节点时,选中情况下的最大值即本身。不选中情况下的最

2020-08-24 20:14:54 2277

原创 算法题 四 之 图的是否有环

课程表 II现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组例如:输入: 4, [[1,0],[2,0],[3,1],[3,2]]输出: [0,1,2,3] or [0,2,1,3]解释: 总共有 4 门课程

2020-08-14 11:36:33 136

原创 算法题 三 之 二叉树展开为链表

二叉树展开为链表题目:给定一个二叉树,原地将它展开为一个由右子树连接的单链表。leetcode 传送门思路:定义一个方法,传入当前节点与上一个需要被连接的节点。返回值是此节点以及所有子树处理完毕后的最后一个节点。递归调用即可。(要注意先处理左子节点,然后提前存好右子节点)附上代码public void flatten(TreeNode root) { if(root == null){ return; } TreeNode lastNode = root;

2020-08-04 17:14:17 112

原创 算法题 二 之 最小区间

最小区间题目:你有 k 个升序排列的整数列表。找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中。我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区间 [a,b] 比 [c,d] 小。例如:输入:[[4,10,15,24,26], [0,9,12,20], [5,18,22,30]]输出:[20,24]解释:列表 1:[4, 10, 15, 24, 26],24 在区间 [20,24] 中。列表 2:[0, 9, 12, 20]

2020-08-04 16:36:14 605

原创 算法题 一 之 整数拆分

整数拆分给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。例如:输入10,输出36。10 可以 拆分成3 3 4,3 * 3 * 4 = 36。解法:这道题有很多子问题的解可以重复使用,所以采用动态规划的思想来接。public int integerBreak(int n) { // 动态规划 dp[i]:当处于i时,拆分了至少两个以上的最大乘积 // 第一步:定义 i ,i代表 2 .... n 的循环,所以

2020-08-03 10:05:57 764

原创 EvenBus源码分析

EvenBus 是一款发布与订阅Android框架,和Java的RabbitMq类似。可以把EvenBus理解成是进程内的通信,RabbitMq可以是进程间和进程内的通信。话不多说,这篇文章主要用于讲解大致流程和EvenBus的数据结构,细节在下一篇文章中会详细介绍。一般而言,使用EvenBus的使用有如下流程①:在需要的地方注册EvenBus②:在注册过的对象里,写上一个非抽象的公用...

2020-03-26 17:24:44 245

原创 Android自定义View之测量之MeasureSpec分析

众所周知,Android的自定义View有三大方法,分别为测量、布局、绘制。在两年多之前,我进行过绘制过程的大致梳理,然而就没有在研究过这个流程了。然后,直到有一天,一次面试过程中,被面试官问道:onMeasure(int widthMeasureSpec, int heightMeasureSpec)里,这个两个值应该如何去看?我恍然大悟,我一直漏掉这一块(之前的Android自定义布局,这...

2020-01-14 16:22:32 309

Android 一键国际化

一款AndroidStudio插件,使用该插件,可以快速生成28种语言的string.xml文件。

2017-12-08

volley框架

volley框架

2017-08-20

空空如也

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

TA关注的人

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