自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

liuwg1226的专栏

修行与精进

  • 博客(301)
  • 资源 (4)
  • 收藏
  • 关注

原创 Android知识体系导图

为了方便自己和大家的阅读以及对 Android 知识体系的全面了解,特写出本篇引导文章。一 Android框架层1.1 系统启动流程Android系统启动系列1 进程基础Android系统启动系列2 init进程Android系统启动系列3 zygote进程Android系统启动系列4 SystemServer进程上Android系统启动系列5 SystemServer进程下Android系统启动系列6 AMS的启动Android系统启动系列7 进程创建流程Android系统启动系列8 

2021-03-14 11:01:01 5597 6

原创 Android Input系统之 InputMonitor 更新流程

分析源码为 android 12。

2024-01-30 16:44:56 621

原创 Dialog 对应的 Context 的探究

创建dialog时,如果传入构造方法不是一个activity类型的上下文,则导致WindowManagerImpl类型为Window的变量mParentWindow,从而导致WindowManagerGlobal的addView不会调用Window的adjustLayoutParamsForSubWindow方法,从而不会给attr.token赋值,导致在WindowManagerService服务中的身份验证失败,抛出BadTokenException异常。

2024-01-28 00:00:50 795

原创 Android 12 Token 机制

在 android framework 框架中 activity 和 window 是相互关联的,而他们的管理者 AMS 和 WMS 是怎么来实现这种关联关系的,答案就是通过 token。首先大家需要了解一下 LayoutParams,当然属性很多,简单了解即可:这里就说到了 token 的问题,应用窗口程序和子窗口均需要获取到 Activity 的 token。那么 token 是什么呢?

2023-12-27 14:50:38 1939

原创 LeetCode 88 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n。

2023-05-06 20:43:57 630 1

原创 Android 全局手势识别原理

本文是对全局手势识别进行分析,那什么是全局手势呢?简单来说就是在任何界面都需要识别的手势,比如:在任何界面从手机屏幕左侧滑动,当前的界面会退出 (类似 back 键)。我们知道,在 Android 系统中一个 Activity 在显示时,当对屏幕触摸事件进行响应时,经过了许多逻辑处理,详细分析可以参考之前对 IMS 原理分析的一系列文章:中的输入系统章节。接下来对全局手势事件注册监听及处理进行分析。目前使用10.0代码分析。

2023-03-21 15:49:34 1397

原创 Android AMS 系列之 systemReady

Android 系统服务进程 system_server,进入消息循环前的最后一步,就是调用 AMS 的 systemReady() 方法。今天我们分析一下这里的流程。

2023-03-15 16:13:40 1045

原创 android FgThread线程

几个关键属性private static FgThread sInstance FgThread对象private static Handler sHandler handler对象,用来处理消息private static HandlerExecutor sHandlerExecutor 用来执行任务ServiceThread类继承自HandlerThread,是一个拥有属于线程自己的Looper对象没有对外提供构造方法,私有的构造方法里面,设置了线程名为android.fg}.}.}

2022-09-06 23:29:51 1115

原创 LeetCode 3---Longest Substring Without Repeating Characters

Example 1:Output: 3Example 2:Output: 1Example 3:Output: 3。

2022-09-04 00:08:59 179

原创 LeetCode 387---First Unique Character in a String

Given a string s, find the first non-repeating character in it and return its index. If it does not exist, return -1.Example 1:Example 2:Example 3:Constraints:

2022-09-03 23:15:56 208

原创 JAVA 虚拟机架构

在我看来,不管学习什么样的知识或技术,首先要做的就是从全局上去认识它,这样才能避免盲人摸象,事倍功半的情况发生。既然要学习 JVM,就要先了解它的整体架构,于是我画了个 JVM 架构图来帮助大家认识它。对 JVM 还不太了解的同学第一次看到这张花里胡哨的图肯定会一脸懵逼,不用怕,其实我们只需要重点理解并掌握其中一部分 (同时也是面试重点) 就好了,比如运行时数据区、垃圾收集器、内存分配策略和类加载机制等,类文件结构也可以学习一下,其他的稍作了解即可。...

2022-08-28 22:06:39 670

原创 力扣203题---反转链表

在遍历链表时,将当前节点的next指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。链表中节点的数目范围是 [0, 5000]...

2022-08-27 01:01:53 188

原创 力扣344题---反转字符串

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]输入:s = [“h”,“e”,“l”,“l”,“o”]输出:[“h”,“a”,“n”,“n”,“a”,“H”]输出:[“o”,“l”,“l”,“e”,“h”]s[i] 都是 ASCII 码表中的可打印字符。...

2022-08-26 23:39:01 139

原创 链表力扣142题---环形链表

这个公式告诉我们,重新设定fast在相遇的位置出发,slow在起点位置出发,都各走一步,那么它们最终都会相遇,并且相遇的位置为第一个节点的地址。假设这是一个链表,带环的是一个循环结构;假设起点到第一个节点的距离为L,第一个节点到相遇的位置为X,整个环的大小为C。fast:L+X+NC(因为不知道环的大小,所以不知道slow到相遇的位置时,fast转了几圈)这个题目是要我们找到环的第一个节点,返回它的地址,那么,我们应当该怎么做呢?有slow和fast从起点到相遇的位置为。...

2022-08-26 23:28:17 137

原创 链表力扣205题---反转链表

如链表:1 2 3 4 5,那么递归到最后一个结点5时,当前结点也就是4的下一个结点就是5,那么4-next=5,4->next->next = 5->next。同时返回新的头也就是5的位置,就如此递归返回,就完成了链表反转,同时反转后的头也找到了。(1)反转链表,可以采用头插法的思想,将每个元素从头到尾依次遍历,每次都将元素插入到头部,从而将链表反转。其实就是迭代法,如:1->2->3 变成 1...

2022-08-25 23:41:55 82

原创 链表力扣203题---移除链表元素

用temp表示当前节点,temp.next表示当前节点的下一个节点;最后返回 newHead.next,即将 newHead的下一个节点作为头节点返回。删除一个节点你要想到的代码:head.next=head.next.next;由于它是第一个节点,要删就得知道它的前一个节点,所以我们可以建一个虚拟节点。依次遍历每个节点,当temp.next=null;让它指向head,那么就得到一个新的链表;当要删除的处于第一个节点和最后一个节点。即找到该结点的前一个结点。...

2022-08-25 23:02:56 126

原创 数组力扣27题---移除元素

双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。

2022-08-24 23:06:48 215

原创 数组力扣283题---移动零

O (n) n为序列长度。

2022-08-24 22:40:16 285

原创 数组力扣485题---最大连续1的个数

从左开始往右比较,如果是1开始计数;提示:1

2022-08-24 22:03:09 389 1

原创 JVM 基础 - 类字节码详解

一 多语言编译为字节码在JVM运行计算机是不能直接运行java代码的,必须要先运行java虚拟机,再由java虚拟机运行编译后的java代码。这个编译后的java代码,就是本文要介绍的java字节码。为什么jvm不能直接运行java代码呢,这是因为在cpu层面看来计算机中所有的操作都是一个个指令的运行汇集而成的,java是高级语言,只有人类才能理解其逻辑,计算机是无法识别的,所以java代码必须要先编译成字节码文件,jvm才能正确识别代码转换后的指令并将其运行。Java代码间接翻译成字节码,储存字节

2021-10-24 22:14:45 2796

原创 JUC 工具类之 Exchanger 详解

一 Exchanger 简介线程间的数据共享除了定义一个共享数据然后各个线程去访问这种方式外,还可以使用 Exchanger 交换数据。Exchanger——交换器,是 JDK1.5 时引入的一个同步器,从字面上就可以看出,这个类的主要作用是:进行两个线程之间的数据交换。Exchanger 有点类似于 CyclicBarrier,我们知道 CyclicBarrier 是一个栅栏,到达栅栏的线程需要等待其它一定数量的线程到达后,才能通过栅栏。Exchanger 可以看成是一个双向栅栏,如下图:Th

2021-09-13 16:52:02 691

原创 JUC 工具类之 Phaser 详解

一 概述Phaser 是 JDK1.7 推出的,一个可重用的同步障碍,与 CyclicBarrier,CountDownLatch 功能类似,但是它支持更灵活的用法。先简单说明这个类的作用。假设有一个大工程,可以分为多个阶段,每一个阶段有多个人参与,并且每一个阶段需要参与的所有人都完成这个阶段的事情,才可以进入下一个阶段,然后所有人又继续做下一个阶段的事,直到所有阶段都完成,当然这途中每个人都可以随时退出,整个工程也可以中途终止。二 Phaser 的使用例如某天陈皮约小美,小雪去他家吃饭。这个事情可

2021-09-12 23:17:00 734

原创 JUC 工具类之 CyclicBarrier 详解

一 概述上一篇我们讲了 CountDownLatch 可以解决多个线程同步的问题,相比于 join 来说它的应用范围更广,不仅可以应用在线程上,还可以应用在线程池上。然而 CountDownLatch 却是一次性的计数器,以王者农药来说,咱们不可能一场团战就决定比赛的输赢,所以在某些场景下,咱们是需要重复使用某个等待功能的,这就是我们今天要介绍的另一个主角——CyclicBarrier。二 CyclicBarrier 概念CyclicBarrier 翻译为中文是循环(Cyclic)栅栏(Barrie

2021-09-12 13:18:21 290

原创 JUC 工具类之 CountDownLatch 详解

一 提出一个问题如何实现让主线程等所有子线程执行完了后,主要线程再继续执行?即如何实现一个线程等其他线程执行完了后再继续执行?1.1 join 解决方案在前面的文章中我们介绍了 Thread 类的 join 方法,join 的工作原理是,不停检查 thread 是否存活,如果存活则让当前线程永远 wait,直到 thread 线程终止,线程的 notifyAll 就会被调用。下面我们就使用 join 来实现上面的问题。import java.util.Random;import java.uti

2021-09-11 18:31:21 427

原创 JUC工具类之 Semaphore 详解

一 概述1.1 Semaphore 是什么Semaphore 一般译作 信号量,它是一种线程同步工具,主要用于多个线程对共享资源进行并行操作的一种工具类。它代表了一种许可的概念,是否允许多线程对同一资源进行操作的许可,使用 Semaphore 可以控制并发访问资源的线程个数。1.2 Semaphore 的使用场景Semaphore 的使用场景主要用于流量控制,比如数据库连接,同时使用的数据库连接会有数量限制,数据库连接不能超过一定的数量,当连接到达了限制数量后,后面的线程只能排队等前面的线程释放数据

2021-09-10 23:39:22 354 1

原创 JUC 锁之 LockSupport 详解

一 概述今天我们来介绍 Java 并发编程系列之 LockSupport,在介绍 Synchronized 的时候我们有提过,不推荐同学们使用 Object 的 wait、notify、notifyAll 等函数做多线程间的通信协同,使用 LockSupport 会是更好的选择,本篇就来谈谈 LockSupport,也正好为下篇的 AQS(AbstractQueuedSynchronized)打基础。二 LockSupport 概念LockSupport 是线程工具类,主要作用是阻塞和唤醒线程,底层

2021-09-09 14:34:01 463

原创 JUC 锁之 ReentrantReadWriteLock 详解

一 概述ReentrantReadWriteLock(后面简称 RRW),我们一般称之为读写锁,主要使用在:读多写少的场景。1.1 读写锁规范作为合格的读写锁,先要有读锁与写锁才行。所以声明了 ReadWriteLock 接口,作为读写锁的基本规范。之后都是围绕着规范去实现读锁与写锁。1.2 读锁与写锁ReadLock 与 WriteLock 就是读锁和写锁,它们是 RRW 实现 ReadWriteLock 接口的产物。但读锁、写锁也要遵守锁操作的基本规范.所以 WriteLock 与

2021-09-08 18:43:09 238

原创 Synchronized 与 ReentrantLock 的区别

工作中我们经常会遇到 Java 常见的加锁方法,本文着重介绍最常见的 synchronized 与 ReentrantLock 的区别,以及说明在动态高并发时为什么推荐 ReentrantLock 而不是 Synchronized?一 Synchronized 与 ReentrantLock 的区别1.1 底层实现的区别底层实现上来说,synchronized 是 JVM 层面的锁,是 Java 关键字,通过 monitor 对象来完成(monitorenter 与 monitorexit),对象只有

2021-09-07 18:56:29 6438 2

原创 JUC 锁之 ReentrantLock 详解

一 概述先提出一些问题:什么是可重入,什么是可重入锁? 它用来解决什么问题?ReentrantLock的核心是AQS,那么它怎么来实现的,继承吗? 说说其类内部结构关系。ReentrantLock是如何实现公平锁的?ReentrantLock是如何实现非公平锁的?ReentrantLock默认实现的是公平还是非公平锁?使用ReentrantLock实现公平和非公平锁的示例?ReentrantLock和Synchronized的对比?接下来对 ReentrantLock 的分析,我们会一

2021-09-05 23:10:14 272

原创 JUC 原子类之 CAS,Unsafe 和原子类详解

一 CAS前面我们说到,线程安全的实现方法包含:互斥同步: synchronized 和 ReentrantLock非阻塞同步: CAS,AtomicXXXX无同步方案: 栈封闭,Thread Local,可重入代码1.1 什么是 CASCAS 的全称为 Compare-And-Swap,直译就是对比交换。是一条 CPU 的原子指令,其作用是让 CPU 先进行比较两个值是否相等,然后原子地更新某个位置的值,经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说 CAS 是靠硬件实现的,JV

2021-09-04 21:03:57 496

原创 JUC - 类汇总和学习指南

一 概述我们先来看下 JUC 的包括那些部分:Lock 框架和 Tools 类 (把图中这两个放到一起理解)Collections: 并发集合Atomic: 原子类Executors: 线程池二 Lock 框架和 Tools 类2.1 类结构总览2.2 接口:ConditionCondition 为接口类型,它将 Object 监视器方法 (wait、notify 和 notifyAll) 分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等

2021-09-04 17:09:06 265 1

原创 Java final 详解

一 final 基础使用1.1 修饰类当某个类的整体定义为 final 时,就表明了你不能打算继承该类,而且也不允许别人这么做。即这个类是不能有子类的。注意:final 类中的所有方法都隐式为 final,因为无法覆盖他们,所以在 final 类中给任何方法添加 final 关键字是没有任何意义的。这里顺道说说 final 类型的类如何拓展? 比如 String 是 final 类型,我们想写个 MyString 复用所有 String 中方法,同时增加一个新的 toMyString() 的方法,应

2021-09-03 18:26:11 16155 2

原创 Java 内存模型详解

一 基础1.1 并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写 - 读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共

2021-09-02 23:17:06 142

原创 Java 并发知识体系和理论基础

一 概述对于一个 Java 程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一。因为并发编程是 Java 语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,更为考验一个程序员的内功。尤其是大数据时代的来临,高并发更成为了家常便饭,工作中,你总是绕不开并发编程的任务,比如说,你想写个程序,一边从文件中读取数据,一边还要做实时计算…所以,想成为一名资深的 Java 后端工程师,并发编程必须要牢牢把握。二 知识体系三 理论基础3.1 为什么需要多线程?众所周

2021-08-31 18:53:19 235

原创 Java 锁系列

一 概述Java 提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自 JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java 中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录:二 乐观锁 VS 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在 Java 和数据库中都有

2021-08-31 00:02:34 340 4

原创 AbstractQueuedSynchronizer(AQS) 原理

一 概述1.1 AQS 是什么?AQS (AbstractQueuedSynchronizer,抽象队列同步器) 是并发开发中的一个基础组件,是一个用于构建锁和同步器的框架,许多同步器都可以通过 AQS 很容易并且高效地构造出来。 在 JDK 中,不仅 ReentrantLock (可重入锁) 和 Semaphore (信号量) 是基于 AQS 构建的,还包括 CountDownLatch (计数器)、ReentrantReadWriteLock、SynchronousQueue 和 FutureTas

2021-08-30 18:43:33 332

原创 Java Executor 框架

一 概述我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等。线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从 JDK1.5 开始,为了把工作单元与执行机制分离开,Executor 框架诞生了,他是一个用于统一创建与运行的接口。Executor 框架实现的就是线程池的功能。线程的工作单位是 Runnable 和 Callable,执行机制由 Executor 框架提供。二 Executor 框架2.1 Executor 框架的两级调度在上层,

2021-08-27 17:58:37 209

原创 java 并发之 this 逃逸

一 概述《java并发编程实践》的第三章,对象的发布和逸出,作者提到了2种常见的对象逸出情况:在构造函数中注册事件监听在构造函数中启动新线程示例代码如下:public class ThisEscape { public ThisEscape(EventSource source) { source.registerListener( new EventListener() { public void onEvent

2021-08-27 16:21:08 412

原创 Java 线程池原理

一 概述随着计算机行业的飞速发展,摩尔定律逐渐失效,多核 CPU 成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C 提供的线程池 ThreadPoolExecutor 类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述了线程池概念和用途,接着结合线程池的源码,帮助大家领略线程池的设计思路,最后回归实践,通过案例讲述使用线程池遇到的问题,并给出了一种动态化线程池解决方案。1.1 线程池是什么线程池(Thread

2021-08-26 18:46:35 304

原创 CAS 原理

一 概述我们讲了 N 篇关于锁的知识,确实,锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?今天要出场一个大 BOSS:CAS 无锁算法,可谓是并发编程核心中的核心!温故首先我们再回顾一下原子性问题的原因,参考【漫画】JAVA并发编程 如何解决原子性问题。两个线程同时把 count=0 加载到自己的工作内存,线程 B 先执行 count++ 操作,此时主内存已经变化成了 1,但是线程 A 依旧以为 count=0,这是导致问题的根源。所以解决方案就是:不能让线程 A 以为 count=

2021-08-25 17:34:22 530

8974平台camera模块设计方案

8974平台camera模块设计方案,详细描述了高通平台camera模块的设计

2018-06-05

织梦核心文件

织梦include核心文件,可以在织梦官方免费下载

2014-12-03

android基础知识培训文档2

android基础知识培训文档2

2014-01-15

android基础知识培训文档

android基础知识培训文档,内部培训文档

2014-01-15

空空如也

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

TA关注的人

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