自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 资源 (8)
  • 收藏
  • 关注

原创 Android javaMail mergeDebugJavaResource FAILED解决

javamail引包报错

2023-08-08 14:41:09 865

原创 git 仓库地址迁移

Git仓库地址迁移

2023-07-27 15:50:26 302

原创 Android oss policy上传

Android OSS policy上传

2023-07-07 10:28:34 1072

原创 Android更新UI的方式

目录Activity.runOnUiThread(Runnable)View.post(Runnable) View.postDelay(Runnable,long)Activity.runOnUiThread(Runnable)流程介绍:1.首先入口Handler类中runOnUiThread方法,如果当前线程不是UI线程,就调用mHandler.post(action); public final void runOnUiThread(Runnable action) {

2022-02-24 13:30:01 1189 1

原创 彻底搞懂LeakCanary检测泄漏原理

LeakCanary原理LeakCanary如何初始化?LeakCanary.install()1.1 ActivityDestroyWatcher.install()1.2 FragmentDestroyWatcher.install()1.3 listener.onLeakSentryInstalled()LeakCanary如何检测Activity退出并释放的原理?LeakCanary是如何使用ActivityLifecycleCallBacks?RefWatcher是什么呢?引用队列和弱引用代码应用

2022-02-24 13:29:30 1019

原创 Android面试必问框架原理

Android面试必问框架原理volatile的实现原理synchronized的实现原理join方法实现原理CAS无锁编程的原理ReentrantLock的实现原理AOP理解IOC理解dagger2注入原理hilt原理组件化通信使用autoService+ServiceLoaderARouterBinderServiceManager启动`SM注册流程`Binder相关类图bindService流程图手写Binder实现AIDL原理Retrofit原理OkHttp拦截器流程Glide原理EvenetBus

2022-02-24 12:09:01 2924

原创 SSDP协议

SSDP(Simple Service Discovery Protocol)简单服务发现协议,用于发现局域网里面的设备和服务。SSDP消息分为设备查询消息、设备通知消息两种,通常情况下,使用更多地是设备查询消息。1、设备查询消息:格式例子如下:M-SEARCH * HTTP/1.1HOST: 239.255.255.250:1900MAN: “ssdp:discover”MX: 5ST: ssdp:all第一行 消息头,固定;第二行 HOST对应的是广播地址和端口,239.255.2

2022-02-24 12:08:05 8544

原创 Modbus

一、简介Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。二、报文先来简单分析一条MODBUS报文,例如:01 06 00 01 00 17 98 04   01

2022-02-24 12:02:36 3475

原创 java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged

最近做的项目,用webview加载网页,自测好好的,突然有一天,项目赋予了系统级应用能力,这个时候,webview不能用了;狗血,怎么办呢?因为应用是系统级别的,在AndroidManifest.xml中添加了android:sharedUserId=“android.uid.system”根据异常分析,是安全问题限制了webview控件使用追溯源码发现有这样的判断final int uid = android.os.Process.myUid();if (uid == android.os.

2022-02-24 11:59:04 3457

原创 快手Android上机面试:设计一个下载文件的框架

一个开放的上机面试题,能想到什么就写什么,我总结考的是以下几点吧:第一考文件下载功能的实现第二考代码习惯,代码风格是否规范第三考框架搭建能力,线程切换之类的思路:1、下载文件用HttpUrlConnection、Okhttp随便写2、代码规范尽量多看看阿里的文档规范,成员变量命名规范,接口名,方法名等见名识义3、考虑简单实现,一个Manager管理类,供程序调用;再设计两个接口,一个负责核心逻辑编写,一个负责数据监听;Manager管理类除了实现核心逻辑接口,还要实现Runnable接口;至于线

2021-06-22 20:16:40 570 1

原创 哈夫曼树构造以及代码实现

哈夫曼树的构造什么是哈夫曼树理解哈夫曼树哈夫曼树的构造哈夫曼树构造-代码实现什么是哈夫曼树构造一颗二叉树,该树的带权路径长度达到最小,称为最优二叉树,也称为哈夫曼树(Huffman Tree)注:带权路径长度就是下文提到的树的编码长度理解哈夫曼树为了更深理解哈夫曼树的由来,我们先来举个例子一步一步引入哈弗曼树是如何解决编码问题的假设有一串字符,包含abcdefg这几个字符,每个字符出现的频次不同,如图:先来思考一下,给定一段字符串,如何对字符串进行编码可以使得字符串的编码存储空间最少?假如

2021-06-14 23:48:14 5697 4

原创 HashMap源码分析

Hash源码一、Hash表二、hash值怎么计算2.1 为什么用hash计算2.2 计算数组下标三、如何添加键值对四、hash碰撞|冲突五、如何通过key找value六、为什么需要加载因子6.1 为什么需要加载因子?6.2 什么时候扩容呢?6.3 扩容会带来什么问题呢?6.4 hashMap java8有什么改进一、Hash表拿hashMap举例,因为hashMap是hash表实现的,在jdk1.8之前,都是通过数组+链表来实现的hashmap,数组就是一个桶,存储元素和查找都要先找到桶的位置,就像是

2021-06-14 22:33:21 364 2

原创 ThreadLocal原理分析

ThreadLocal初步理解ThreadLocal一、ThreadLocal原理总结二、源码分析2.1 存储2.2 取值2.3 移除初步理解ThreadLocalThreadLocal是线程本地变量,是隔离的思想来解决线程安全问题的一种方法ThreadLocal是HashMap思想在多线程的应用ThreadLocal是作为Key为ThreadLocalMap获取数据而备一、ThreadLocal原理总结大致原理总结:在每个Thread中包含一个ThreadLocalMap,ThreadLoc

2021-06-14 22:31:12 254

原创 Android事件分发流程总结

Activity事件分发源码流程图

2021-06-04 11:36:55 718

原创 for-each原理

for-each原理

2021-06-04 11:34:14 48

原创 Java类加载器

类加载器一、类加载器ClassLoader类图二、类加载器运用三、PathClassLoader源码四、DexClassLoader源码五、PathClassLoader和DexClassLoader区别一、类加载器ClassLoader类图二、类加载器运用三、PathClassLoader源码四、DexClassLoader源码五、PathClassLoader和DexClassLoader区别唯一区别:dex优化后的odex的一个存储路径不同DexClassLoader:如下图,第

2021-06-04 11:32:45 132

原创 算法面试:Java如何判断链表是否有环

快慢指针法判断链表是否有环一、构建单向链表二、算法实现步骤三、编写本地测试方法四、运行测试一、构建单向链表声明一个表示单向链表节点的静态内部类,通过该类对象可以构建一条链表结构。二、算法实现步骤实现快慢指针算法,步骤如下:声明两个节点指针,一个快指针,一个慢指针;两个指针同时遍历,快指针每次移动两个节点,慢指针每次移动一个节点;如果快慢指针在同一个节点相遇,则表示链表有环;快指针遍历完毕,则链表无环。三、编写本地测试方法编写本地测试主方法,测试步骤如下:构建两条链表,一条有环

2021-06-04 11:26:20 399

原创 解决AndroidStudio下载gradle慢的问题

1.使用下载工具下载gradlegradle的官网下载地址是 https://gradle.org/releases,打开网址后下载complete版本的gradle。2.替换本地gradle完全关闭AS,包括正在下载gradle的进程也需要关闭。进入到本地的gradle存储目录,我的MAC是/Users/XX/.gradle/wrapper/dists,linux系统的话应该是在个人用户目录下。把gradle-6.5-all.zip文件复制到 gradle-6.5-all/8bnwg5hd3w55

2021-03-15 16:06:52 240

原创 Https原理

目录HTTP缺点HTTPS的安全性数据保密性一、连接建立过程二、通信过程数据完整性通信双方身份的真实性抓包原理HTTP缺点HTTP也有几个较为显著的缺点:通信使用明文,内容容易被抓包泄露无法证明报文的完整性,所以有可能遭到篡改不验证通信方的身份,因此有可能遭遇伪装HTTPS的安全性正是由于这几个显著的缺点存在,所以HTTPS应运而生。https俗称超文本传输安全协议。是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详

2021-01-25 11:37:01 583

原创 小程序入门之下载安装工具

目录一、下载安装开发者工具二、创建一个小程序并注册一、下载安装开发者工具微信开发者工具下载地址打开下载页面,选择稳定版下载即可安装成功打开界面:二、创建一个小程序并注册点击新建,去注册页面注册,注意填写的邮箱不能在微信公众平台绑定过的,然后找到小程序中的开发者管理,点击开发设置,复制APPID,并填入刚才创建小程序需要的APPID文本框中找不到页面的话,可以按照这个链接进入去找APPID添加链接描述选择不使用云服务器,选择javascript即可,点击创建即可...

2021-01-20 13:49:10 595

原创 了解Binder与AIDL关系

了解Binder与AIDL关系什么是BinderAIDL与BinderService接口方法调用流程小结什么是BinderBinder是一个类,它实现了IBinder接口,而IBinder接口定义了与远程对象的交互协议。通常在进行跨进程通信时,不需要实现IBinder接口,直接从Binder派生即可。除了实现IBinder接口外,Binder中还提供了两个重要的接口。(1)Transact(),客户端调用,用于发送调用请求(2)onTransact(),服务端响应,用于接收调用请求因为以上的原因

2021-01-11 21:16:23 493

原创 Android各版本新特性简单总结

目录Android5.0新特性Android6.0新特性Android7.0新特性Android8.0(O)新特性Android9.0(P)新特性Android10.0(Q)新特性Android11.0(R)新特性Android5.0新特性MaterialDesign设计风格支持64位ART虚拟机5.0推出ART虚拟机,5.0之前都是Dalvik他们的区别是:Dalvik,每次运行,字节码都需要通过即时编译器转换成机器码(JIT)ART,第一次安装应用的时候,字节码就会预先编译成机器码(A

2021-01-02 20:33:04 873

原创 面试:volatile特性详解

目录volatile 是什么?volatile 的可见性那么JMM与volatile有什么关系?JMM关于同步的规定JMM的主内存与工作内存描述示例代码来认识可见性volatile的原子性特征为什么说不保证原子性呢?volatile怎么解决原子性问题volatile的指令重排volatile 禁止实现指令重排优化单例模式下的volatilevolatile 是什么?Java语言规范第三版中对volatile的定义如下:java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应确保

2021-01-02 01:05:49 366

原创 Activity切换生命周期

Activity(A)启动后点击Home键再回到应用 的生命周期:onPause(A)->oStop(A)->onRestart(A)->onStart(A)->onResume(A)两个Activity(A->B)切换(B正常的Activity)的生命周期:onPause(A)->onCreate(B)->onStart(B)->onResume(B)->oStop(A)这时如果按回退键回退到A :onPause(B)->onResta

2020-12-31 15:19:50 719

原创 算法:删除排序数组中的重复项 java实现

Leecode 26. 删除排序数组中的重复项给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数

2020-12-31 13:21:20 103

原创 算法:删除排序数组中的重复项 II java实现

Leecode 80. 删除排序数组中的重复项 II给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝

2020-12-31 13:13:58 131

原创 算法:数组中找出重复的数字 Java实现

给的数组中找出重复的数字?方法一:set.add(num) 返回值是boolean类型,来实现巧妙去重class Solution { public int findRepeatNumber(int[] nums) { Set<Integer> set = new HashSet<>(); for (int num : nums) { if (!set.add(num)) return

2020-12-31 12:45:38 611

原创 算法:两数之和 Java实现

题目给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]可以一次循环搞定,在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我

2020-12-31 12:11:07 160

原创 Android系统启动流程

Android系统启动流程那么结合本篇以及本系列的前三篇文章,我们就可以得出Android系统启动流程,如下所示。1.启动电源以及系统启动当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。2.引导程序BootLoader引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。3.Linux内核启动内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统

2020-12-30 14:06:39 233

原创 内存泄漏面试总结

目录内存泄漏怎么产生的避免内存泄漏的一些技巧内存泄漏怎么产生的内存泄漏的主要原因在于一个生命周期长的东西间接引用了一个生命周期短的东西,会造成生命周期短的东西无法被回收避免内存泄漏的一些技巧1、不要以为Java永远会帮你清理回收正在运行的threads.在上面的代码中,我们很容易误以为当Activity结束销毁时会帮我们把正在运行的thread也结束回收掉,但事情永远不是这样的!Java threads会一直存在,只有当线程运行完成或被杀死掉,线程才会被回收。所以我们应该养成为thread设置退出逻

2020-12-29 19:55:19 196

原创 手机连接小盒子怎么看logcat日志

前提:远程手机调试,手机连接小盒子,无法插入电脑USB,这个时候想调试手机看日志怎么办,往下看:Step1:设置手机和PC在同一网络下,即连接同一WIFI;用USB连接手机;在终端输入:adb tcpip 5555解释:5555 端口是默认端口,也可以用其他端口Step2:断开手机与PC的USB连接,在终端输入:adb connect IP:5555, 比如这样:adb connect 192.168.10.161:5555终端会返回:connected to 192.168.10.16

2020-12-29 19:38:57 173

原创 handler面经10问

handler面经10问1. Handler 的基本原理2. 子线程中怎么使用 Handler3. MessageQueue 获取消息是怎么等待4. 为什么不用 wait 而用 epoll 呢?5. 线程和 Handler Looper MessageQueue 的关系6. 多个线程给 MessageQueue 发消息,如何保证线程安全7. Handler 消息延迟是怎么处理的8. View.post 和 Handler.post 的区别9. Handler 导致的内存泄漏9.1 内存泄漏原因9.2 避免h

2020-12-23 22:28:47 161 1

原创 Android8.0以上无法收到隐式广播 BroadcastQueue: Background execution not allowed:

问题2019-01-14 21:28:54.725 1083-1167/? W/BroadcastQueue: Background execution not allowed: receiving Intent { act=com.rlk.powersavemanagement.ACTION_AVAILABLE_TIME flg=0x10 (has extras) } to com.transsion.powercenter/.provider.PowerWidgetProvider这是怎么搞得?正

2020-12-21 18:22:58 627 2

原创 单例模式-线程安全的5种实现

前言单例模式是 Java 中最简单设计模式之一。在运行期间,保证某个类只创建一个实例,在实际项目中,还要考虑线程的安全性,面试的时候很多面试官容易问到这个问题,有几种实现方式,分别如何保证线程安全,小编直接上各种实现方案的线程安全写法:一、懒汉式特点:延迟加载使用场景:如果开销比较大,希望用到时才创建,就要考虑延迟实例化public class Singleton1 { //volatile 为了防止指令重排序 private static volatile Singleton1

2020-12-18 16:28:49 954 2

原创 Java垃圾回收机制-可达性分析算法教你GC如何判断对象的存活

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式==标记文本==插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学

2020-12-18 16:12:04 716 1

原创 GIT经验:修改历史提交的用户信息

相信很多人在使用git的时候,已经配置过author和email了,但是项目做到三分之一,发现一件事,这个项目有点危险,想隐蔽一下自己的身份,肿么办?这个时候,执行git log 已经有N笔历史提交了,首先,你应该找到想要修改的提交id,并锁定到这个commitid的parentid,拷贝下来parentid,其次,利用git命令去分别rebase每个提交修改作者和邮箱,git rebase -i parentid, 这里之所以填写parentid,才能在vim编辑器中看到你想要修改的提交,以及

2020-12-17 21:28:23 1324

原创 经验:Android批量打包APK并批量安装

在实际项目开发中,一个项目会有多个模块,那么如何用一个命令来依次生成多个APK呢?答案是通过gradlew命令进行批量打包假如项目名称为AProject,模块分别有B、C、D,那么如果用命令单独打包分别执行以下命令,assembleRelease、assembleDebug和assembleAndroidTest分别是你实际场景需要打包的渠道,可自行编写./gradlew :B:assembleRelease./gradlew :C:assembleDebug./gradlew :D:ass

2020-12-17 19:45:14 2115

原创 什么是内存泄漏,Java如何解决

一、什么是内存泄漏通俗讲就是该回收的对象,因为引用问题没有被回收,最终会产生OOM二、产生的原因一个长声明周期的对象持有一个短生命周期对象的引用三、Java如何解决Java不会解决,需要开发者通过profile或者mat工具进行分析你可以模拟一段内存泄漏的代码,然后运行,并马上退出activity,这个时候打开profile工具,进入memory来分析内存情况,先强迫进行垃圾回收(如图),然后截取内存快照按照包来找一下LeakActivity会发现有200多个字节没有被回收,代表

2020-12-17 19:21:44 173 1

原创 为什么String是不可变的

先看一段测试代码: @Test public void testStringFinal() { String str = new String("abc"); System.out.println(str.hashCode()); str += "d"; System.out.println(str.hashCode()); str += "e"; System.out.println(st.

2020-12-17 18:33:32 92

原创 ==和equals区别

== 比较内存地址equals 比较存放的内容字符序列是否相等String str1 = "a"+"b"+"c";//常量池String str2 = "abc";//常量池String str3= new String("abc");//堆内存str1==str2 truestr1==str3 falsestr2==str3 falsestr1.equals str2 truestr1.equals str3 truestr2.equels str3 truestr1....

2020-12-17 17:59:46 76

SeekBar进度条的模拟

主界面调用任务类,去做线程执行的任务,进度条时时更新,模拟欺骗用户的过程,先执行到90%,然后3秒直接跳到100%。

2014-10-27

android之观察者模式理解demo

为了理解观察者模式,本人利用生活中的一个小需求,编写了一个小例子,加强记忆,主要模拟了消费者想购买一辆自行车,并且希望时时知道某自行车店的自行车价格变化,当降价的时候,会收到降价通知,并且购买的一个应用场景,还利用简单的回调接口实现安卓UI界面的显示,希望也可以帮到你们! 有问题可以随时联系!

2014-09-16

纯手写布局更灵活模仿expandablelistview

expandablelistview有的时候满足不了我们的需求,自己就模仿实现了一下,做了个demo,希望可以帮到你

2012-11-19

奇异的UI设计

一款奇异的视频播放的UI设计,希望可以帮到设计UI界面的朋友。

2012-11-08

可左右滑动的tab

一般的tab条目是可以点击的,我这个不但可以点击,还可以左右滑动切换到不同的activity

2012-11-07

像qq一样的可扩展的listview

一个模仿qq的可扩展的二级listview,希望可以帮到有需要这个控件的朋友!

2012-11-07

listview上拉刷新

大家在使用listview的时候难免会有分批加载数据的需求,像新浪一样的下拉刷新网上也有源码,本人就不贴了,这个是新写的上拉刷新,希望可以帮到需要的朋友。

2012-11-07

通过模板布局动态生成布局

现在有些项目要求布局动态生成,我这个demo是通过一个xml的布局模板填充到代码中,在代码中直接写了一个填充布局的方法,通过调用这个方法,传入不同的参数实现动态添加布局,只需要抽取出你写好的死布局里面的几种样式就可以了。

2012-11-07

空空如也

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

TA关注的人

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