自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(891)
  • 资源 (2)
  • 论坛 (1)
  • 收藏
  • 关注

原创 Android面试总结

第一部分:Android部分Android基础知识 Android内存泄漏总结 Handler内存泄漏分析及解决 ListView详解 RecyclerView和ListView的异同 AsyncTask源码分析 插件化技术 自定义控件 Android绘制流程 Android动画机制 事件分发机制 ANR问题 Art和Da...

2020-07-15 01:42:11 1194

转载 线程池ThreadPoolExecutor实现原理

引言线程池:可以理解为缓冲区,由于频繁的创建销毁线程会带来一定的成本,可以预先创建但不立即销毁,以共享方式为别人提供服务,一来可以提供效率,再者可以控制线程无线扩张。合理利用线程池能够带来三个好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利..

2021-06-14 01:52:59 27

转载 SurfaceView及TextureView对比

SurfaceView是什么 ?SurfaceView优点及缺点?SurfaceView中双缓冲?TextureView是什么?TextureView优点及缺点?两者的性能相比如何?播放器应该选择谁?SurfaceView是什么?它继承自类View,因此它本质上是一个View。但与普通View不同的是,它有自己的Surface。有自己的Surface,在WMS中有对应的WindowState,在SurfaceFlinger中有Layer。我们知道,一般的Activity包含的

2021-05-23 23:47:58 37

转载 认识ClassLoader

写在前面今天继续《热修复与插件化》专题的分享,专栏的上一篇是说到了JVM的一些基础知识点,本篇接着来说一下ClassLoader的相关内容,当然这里说的是Android中的ClassLoader哈,上一篇《带你认识JVM》中我们已经介绍过了Java中的类加载器、它们各自的作用以及加载流程,这里就不再说了,有需要的自行查看,接下来就直奔主题了,去看Android的类加载机制!一、androidClassLoader基本介绍1.1、种类详解BootClassLoader:它的作用和Java中的B

2021-04-26 01:04:38 43

转载 Android热修复实战之AndFix

目录写在前面目录一、AndFix基本介绍1.1、AndFix简介1.2、AndFix方法体替换规则1.3、AndFix BUG修复过程二、AndFix代码实战2.1、AndFix集成2.2、AndFix初始化2.3、构建APK三、AndFix源码解析写在前面上一篇《Android热修复技术简介》中对Android的热修复技术的概念和常用的技术方案做了一个简单的介绍,那么今天就来实战一下热修复技术,我们使用的是AndFix,为什么是它?因为无论是从使用上

2021-04-26 00:38:11 40

转载 Android 实现搜索历史(2)

该demo使用了自定义的流式布局+AutoCompleteTextView+SharedPreferences实现了各大APP常用到的搜索历史记录的功能,代码简单实用。废话不多说,上效果图为证:上代码:第一步:自定义流式布局ZFlowLayout(让标签自动换行)package cn.cnpp.searchhistory;import android.content.Context;import android.util.AttributeSet;import android

2021-03-12 20:48:38 54

转载 Android 实现搜索历史(1)

SharedPreferences实现本地搜索历史功能,覆盖搜索重复的文本,可清空1. 判断搜索内容是否含表情,不需要可以不判断 /** * 校验字符串是否含有表情 * @param content * @return */ public static boolean hasEmoji(String content){ Pattern pattern = Pattern.compile("[\ud83c\udc00.

2021-03-12 20:44:29 68

转载 Listview与RecyclerView对比浅析【重点对比缓存】

RecyclerView和ListView都是用于加载大量数据的控件,RecyclerView作为listview的改进加强型,相对于ListView,RecyclerView做出了以下优化:1.布局效果ListView 的布局比较单一,只有一个纵向效果;RecyclerView 的布局效果丰富, 可以在 LayoutMananger 中设置:线性布局(纵向,横向),表格布局,瀑布流布局在RecyclerView 中,如果存在的 LayoutManager 不能满足需求,可以自定义 Layout

2021-03-06 21:12:52 118

转载 Java进阶--编译时注解处理器(APT)详解

本文同步发布在掘金,未经本人允许不得转载上篇文章《Java进阶–Java注解及其实例应用》我们使用注解+反射实现了一个仿ButterKnife功能的示例。考虑到反射是在运行时完成的,多少会影响程序性能。因此,ButterKnife本身并非基于注解+反射来实现的,而是用APT技术在编译时处理的。APT什么呢?接下来一起来看。一、APT简介1.什么是APT?APT即为Annotation Processing Tool,它是javac的一个工具,中文意思为编译时注解处理器。APT可以用来在编译时扫描

2021-03-01 01:01:17 142

转载 ReentrantLock实现原理及源码分析

ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Synchronized,ReentrantLock增加了一些高级的扩展功能,比如它可以实现公平锁,同时也可以绑定多个Conditon。可重入性/公平锁/非公平锁  可重入性    所谓的可重入性,就是可以支持一个线程对锁的重复获取,原生的synchronized就具有可重入性,一个用synchronize

2021-02-24 01:24:25 228

转载 Android UI性能优化 检测应用中的UI卡顿

一、概述在做app性能优化的时候,大家都希望能够写出丝滑的UI界面,以前写过一篇博客,主要是基于Google当时发布的性能优化典范,主要提供一些UI优化性能示例:Android UI性能优化实战 识别绘制中的性能问题实际上,由于各种机型的配置不同、代码迭代历史悠久,代码中可能会存在很多在UI线程耗时的操作,所以我们希望有一套简单检测机制,帮助我们定位耗时发生的位置。本篇博客主要描述如何检测应用在UI线程的卡顿,目前已经有两种比较典型方式来检测了:利用UI线程Looper打印的日志 利用C

2021-02-20 00:10:33 63

转载 Android性能优化-检测App卡顿

在移动APP性能评测-流畅度评测中,我们介绍了如何准确客观评价APP的流畅度,最终采用SM指标来评价应用的流畅度,在知道如何评价流畅度之后,我们应该如何来检测出APP中的UI卡顿就是我们面临的一个新的问题;在Android性能优化-App卡顿中介绍了Google官方提供的检测卡顿的方法,除此之外还有那边比较好的方法来检测应用卡顿?目前主流的方法主要有:1.利用UI线程Looper打印的日志,典型代表就是BlockCanary;2.采用Choreographer;BlockCanary:blockcana

2021-02-20 00:06:30 187

转载 Choreographer全解析

前言今天继续屏幕刷新机制的知识讲解,上文说到vsync的处理,每一帧UI的绘制前期处理都在Choreographer中实现,那么今天就来看看这个神奇的舞蹈编舞师是怎么将UI变化反应到屏幕上的。代码未动,图先行UI变化上期说到app并不是每一个vsync信号都能接收到的,只有当应用有绘制需求的时候,才会通过scheduledVsync方法申请VSYNC信号。那我们就从有绘制需求开始看,当我们修改了UI后,都会执行invalidate方法进行绘制,这里我们举例setText方法,再回顾.

2021-02-20 00:04:03 261

转载 Choreographer机制和卡顿优化

Choreographer 是 Android 4.1 google的黄油计划新增的机制,用于配合系统的 VSYNC 中断信号。其主要用途是接收系统的 VSYNC 信号,统一管理应用的输入、动画和绘制等任务的执行时机。也就是(CALLBACK_INPUT,CALLBACK_ANIMATION,CALLBACK_TRAVERSAL,CALLBACK_COMMIT),而我们主要的用途就是来查看app的帧率情况,下面来具体分析下这个神秘的类当我们进行invalidate或者requestLayout时,总会执行

2021-02-20 00:01:46 165

转载 MemoryFile匿名共享内存使用

Android提供了一个高效的共享内存机制。如果应用中涉及到在多个进程间交换数据时使用Android提高的共享内存机制将会大大的提高效率。但是也许是出于安全考虑,在应用层使用共享内存机制将会遇到很多障碍,这篇文章旨在解决这些障碍frameworks/base/core/java/android/os/MemoryFile.java的源码位置下面是5.0版本的网上源码MemoryFile.java使用共享内存的流程大概是:在一个进程中创建一个共享内存。在Android应用层中,用MemoryF

2021-02-19 01:03:26 144

转载 Android匿名共享内存(Ashmem)原理

阅读之前,不妨先思考一个问题,在Android系统中,APP端View视图的数据是如何传递SurfaceFlinger服务的呢?View绘制的数据最终是按照一帧一帧显示到屏幕的,而每一帧都会占用一定的存储空间,在APP端执行draw的时候,数据很明显是要绘制到APP的进程空间,但是视图窗口要经过SurfaceFlinger图层混排才会生成最终的帧,而SurfaceFlinger又运行在另一个独立的服务进程,那么View视图的数据是如何在两个进程间传递的呢,普通的Binder通信肯定不行,因为Binder不太

2021-02-19 00:57:21 104

原创 AndroidStudio 的Profiler+Mat检测内存泄漏

什么是内存泄漏申请了一块内存空间,但是一直没有释放。如果不断的申请还会引起内存溢出(OOM)什么是内存抖动频繁的GC操作,如果垃圾回收的速度没有生成的快,也会引起OOM如何检测?我使用的是Profiler+Mat,前提是必须要ADB调试MAT工具下载地址(https://www.eclipse.org/mat/)运行完Profiler会出现点击MEMORY部分点击下载 开始记录生成右键Heap Dump导出文件然后将该文件通过sd.

2021-02-19 00:30:10 129

转载 linux内存映射mmap原理分析

内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间<---->用户空间两者之间需要大量数据传输等操作的话效率是非常高的。以下是一个把普遍文件映射到用户空间的内存区域的示意图。基本函数 mmap函数是unix/linux下的系统调用,详细内容可参考《Unix Netword programming》卷二12.2节。mmap系统调用并不是完..

2021-02-18 20:23:54 42

原创 git报错git@gitlab.com: Permission denied

新PC安装git和Android studio以后尝试拉取代码自己分支的代码会出现下面的错误23:43 Update failed Warning: Permanently added 'gitlab.com,172.65.251.78' (ECDSA) to the list of known hosts. git@gitlab.com: Permission denied (publickey,keyboard-interactive). Could not read from

2021-02-17 00:24:55 641 1

转载 Android性能优化常见Q

1、图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理?参考回答: 首先我们要清楚图片的三级缓存是如何的 如果内存足够时不回收。内存不够时就回收软引用对象 2、内存中如果加载一张500*500的png高清图片.应该是占用多少的内存?参考回答: 不考虑屏幕比的话:占用内存=500 * 500 * 4 = 1000000B ≈ 0.95MB 考虑屏幕比的的话:占用内存= 宽度像素 x (inTargetDensity ..

2021-02-16 15:31:57 67

转载 为什么静态成员不能访问非静态成员

首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在创建对象的时候,即new 操作的时候才初始化的; 先后顺序是先加载,才能初始化,那么加载的时候初始化static的成员,此时非static的成员还没有被加载必然不能使用,而非static的成员是在类加载之后,通过new操作符创建对象的时候初始化,此时static 已经分配内存空间,所以可以访问! 简单点说:静态成员属于类,不需要生成对象就存在了.而...

2021-02-15 16:40:25 68

转载 android mmap的使用

http://kenby.iteye.com/blog/1164700共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式, 因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数

2021-02-05 01:15:41 173

转载 mmap详解

共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式, 因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映

2021-02-05 01:08:26 120

转载 LeakCanary原理解析

简介LeakCanary是一款开源的内存泄漏检查工具,在项目中,可以使用它来检测Activity是否能够被GC及时回收。github的地址为https://github.com/square/leakcanary使用方式解析将LeakCanary引入AS,在Application中调用如下方法,可以跟踪Activity是否被GC回收。 ...

2021-02-03 00:52:31 75

转载 浅析LRUCache原理(Android)

一. LruCache基本原理LRU全称为Least Recently Used,即最近最少使用。由于缓存容量是有限的,当有新的数据需要加入缓存,但缓存的空闲空间不足的时候,如何移除原有的部分数据从而释放空间用来放新的数据?LRU算法就是当缓存空间满了的时候,将最近最少使用的数据从缓存空间中删除以增加可用的缓存空间来缓存新数据。这个算分的内部有一个缓存列表,每当一个缓存数据被访问的时候,这个数据就会被提到列表尾部,每次都这样的话,列表的头部数据就是最近最不常使用的了,当缓存空间不足时,就会删

2021-02-03 00:43:53 147

转载 Java 8系列之重新认识HashMap

# 声明此文章不是原创文章,但是是最全面的HashMap讲解,本人也在阅读理解中,秉承好东西要分享的原则,希望本篇文章能帮助到大家。# 摘要HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。#简介Java为数据结构中的映射定

2021-02-01 01:05:09 51

转载 Java:CAS(乐观锁)

本文讲解CAS机制,主要是因为最近准备面试题,发现这个问题在面试中出现的频率非常的高,因此把自己学习过程中的一些理解记录下来,希望能对大家也有帮助。什么是悲观锁、乐观锁?在java语言里,总有一些名词看语义跟本不明白是啥玩意儿,也就总有部分面试官拿着这样的词来忽悠面试者,以此来找优越感,其实理解清楚了,这些词也就唬不住人了。synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁。 CAS操作的就是乐观锁,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突

2021-02-01 00:55:05 47

转载 MMKV 原理以及使用

介绍MMKV是基于mmap内存映射的移动端通用key-value组件,底层序列化/反序列化使用protobuf实现,性能高,稳定性强。从2015年中至今,在iOS微信上使用已有近3年,近期移植到Android平台,移动端全平台通用,并全部在Github上开源。MMKV 原理内存准备:  通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。数据组织:  数据序列化方面我们选用 protobuf

2021-02-01 00:50:21 395

转载 Android之练习MVVM+DataBinding框架模式

最近简单学习了MVVM框架,记录一下。结果演示: 分析其功能在不同框架下的构成:无框架 ...

2021-02-01 00:44:57 138

转载 数据结构

字节跳动+京东+360+网易+腾讯踩过的坑第一个:字节跳动一面:已知二叉树BT各结点的先序、中序遍历列分别为A、B、C、D、E、F和C、B、A、E、D、F,试画出该二叉树。二面:已知一棵树的由根至叶子结点按层次输入的结点序列及每个结点的度(每层中自左到右输入),试写出构造此树的孩子-兄弟链表的算法。三面主管面:已知一棵二叉树的前序序列和中序序列分别存于两个一维数组中,试编写算法建立该二叉树的二叉链表。四面交叉面:试编写递归算法,输出广义表中所有原子项及其所在层次。第二个:

2020-12-17 01:07:37 41

转载 HIGH高频H3(21-31)

HIGH21、整数反转给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−231,231− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems...

2020-12-16 01:30:57 79

转载 HIGH高频H2(11-20)

HIGH.11 合并两个排序的链表输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4限制:0 <= 链表长度 <= 1000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof

2020-12-16 01:01:06 98

原创 HIGH高频H1(1-10)

HIGH.1无重复字符的最长子串给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: s = "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注...

2020-12-15 01:50:04 230

转载 Android如何保证一个线程最多只能有一个Looper

1. 如何创建Looper?Looper的构造方法为private,所以不能直接使用其构造方法创建。private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed); mThread = Thread.currentThread();}要想在当前线程创建Looper,需使用Looper的prepare方法,Looper.prepare()。如果现在要我们来实现Looper.prepare

2020-12-11 01:29:40 406

转载 HTTP 和 HTTPS 的区别

前言无论是在校学习还是找工作的时候,老师和面试官都问过同学 HTTP和 HTTPS的区别。平时上网的时候也没有关注这个问题,只是知道计算机网络里 HTTP的概念,所以最近才查资料好好补补这一块。其实这一块的知识延伸很广,如果之前不太了解加密算法和 SSL 协议,可以在学习了这个问题的基础上再做研究。TLS/SSL 工作原理及握手过程详解:https://tyler-zx.blog.csdn.net/article/details/107591115一、HTTP和 HTTPS的基本概念...

2020-12-11 00:18:47 113

转载 滴滴国际化部门Android

面试过程:一面1.android的消息机制2.为什么每个线程最多只能有一个Looper?这是怎么实现的?3.Handler为什么会引发内存泄漏?有哪些解决方式?4.安卓中常用的四种引用类型是什么?它们的特点分别是什么?5.flutter的使用体会6.statelesswidget和statefulwidget的异同7.flutter的状态管理8.JVM的GC算法都有哪些?详细介绍一下分代算法中新生代部分。'stop the world'是什么意思?9.android的

2020-12-10 00:53:28 421

转载 崩溃了,一个HashMap

HashMap应该算是Java后端工程师面试的必问题,因为其中的知识点太多,很适合用来考察面试者的Java基础。面试官: 你先自我介绍一下吧!我: 我是安琪拉,草丛三婊之一,最强中单(钟馗不服)!哦,不对,串场了,我是**,目前在--公司做--系统开发。面试官: 看你简历上写熟悉Java集合,HashMap用过的吧?我: 用过的。(还是熟悉的味道)面试官: 那你跟我讲讲HashMap的内部数据结构?我: 目前我用的是JDK1.8版本的,内部使用数组 + 链表 / 红黑树;我: 方

2020-12-09 01:16:38 80

转载 Java/Android常用数据结构总结

本文主要针对开发中常用的数据结构做个总结,主要还是源码原理相关的内容,尤其是面试需要复习的同学可以多研究一下。线性表ArrayList、LinkedListArrayList基于动态数组实现的,初始化的时候没有指定大小的话,默认容量是10,添加元素的时候会判断是否需要对数组扩容,每次扩容大小为1.5倍,扩容是通过数组的拷贝实现的,这是一个非常耗性能的操作,所以如果可以确定大概的数据量,可以直接指定list大小。由于list是基于数组实现的,数组的特点是在堆内存中用连续的内存空间来存储,所以访问

2020-12-09 01:12:50 96

转载 Leetcode面T17(21-30)树

Q17.21 直方图的水量给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。感谢 Marcos 贡献此图。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/volu.

2020-12-08 00:48:54 47

转载 Leetcode面T17(11-20)树

Q17.11 单词距离有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?示例:输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student"输出:1提示:words.length <= 100000来源:力

2020-12-08 00:33:42 96

Android高级进阶 顾浩鑫

《Android高级进阶》的主要目的在于给读者一个完整的Android中高级开发者知识图谱

2018-09-26

android stuido从入门到精通

android stuido从入门到精通

2017-07-03

augfun的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也

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

TA关注的人 TA的粉丝

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