自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(194)
  • 收藏
  • 关注

原创 R文件详细介绍、瘦身

R 文件可能是很多 Android 开发者既熟悉又陌生的存在。它无处不在,所有使用到资源的地方都离不开它。它又有些陌生,google 已经把它封装的很完美了,以至于很多开发者并不知道它是怎么工作的。那么我们今天就来揭开它神秘的面纱。

2023-12-02 15:58:51 1034

原创 Android 缩减、混淆处理和优化应用

在大多数情况下,如要让 R8 仅移除不使用的代码,使用默认的 ProGuard 规则文件 () 就已足够。不过,在某些情况下,R8 很难做出正确判断,因而可能会移除应用实际上需要的代码。当应用通过 Java 原生接口 (JNI) 调用方法时当您的应用在运行时查询代码时(如使用反射)通过测试应用应该可以发现因错误移除代码而导致的错误,但您也可以通过生成已移除代码的报告检查移除了哪些代码。如需修复错误并强制 R8 保留某些代码,请在 ProGuard 规则文件中添加-keep代码行。

2023-12-02 14:20:52 728

原创 Activity通过setArguments传递到Fragment的Bundle数据是传引用还是传值?

在Android开发中,我们通过Intent/Bundle在组件之间(Activity/Services/ContentProvider/BroadcastReceivers)传递数据,由于组件之间通信方式是 IPC,因此只能通过数据流(byte[])的方式传递Bundle,所以目标组件所获取的数据是一个新对象,组件间传递的Bundle数据是传值。那么,Activity通过setArguments传递到Fragment的Bundle数据是传引用还是传值?答案是:(1)绝大多数的情况下是传引用。

2023-11-03 14:51:56 205

原创 Java中的Reference

一个对象的实例被一个软引用实例指向,那么在GC过程中发生OOM之前,该Object对象实例会被回收掉,在内存充足的情况下是不会被回收的。同时可以将一个引用队列关联到该软引用上,在软引用指向的对象被回收后,该软引用会被加入到关联的引用队列中。c. 第一次服务员过来清理桌子座位时,你可以随时准备让出座位,其实这时候你并没有让出位置,但是后面服务员说出一句让你让出座位时你才会让出座位,这种情况就像虚引用。b. 通过检测它关联的引用队列,取出加入的虚引用对象,查看此时其指向的对象实例是否被回收。

2023-09-01 11:51:32 289

原创 虚引用真的不影响对象的生命周期吗?99%的人都错了

最后一个虚应用是今天要讨论的。事实上,这个是错的。

2023-09-01 11:35:21 159

原创 一篇搞懂TCP、HTTP、Socket、Socket连接池

如果想要使传输的数据有意义,则必须使用到应用层协议比如Http、Mqtt、Dubbo等。基于TCP协议上自定义自己的应用层的协议需要解决的几个问题:心跳包格式的定义及处理报文头的定义,就是你发送数据的时候需要先发送报文头,报文里面能解析出你将要发送的数据长度你发送数据包的格式,是json的还是其他序列化的方式下面我们就一起来定义自己的协议,并编写服务的和客户端进行调用:定义报文头格式:length:000000000xxxx;xxxx代表数据的长度,总长度20,举例子不严谨。

2023-08-21 16:15:09 176

原创 ANDROID 设备写入文件,立即断电重启后,文件丢失,数据没有保存问题

android开发的过程中碰到写入文件后,立即断电重启,发现写入的文件丢失了

2022-06-20 22:22:56 3054

原创 简单说一说Java中的CopyOnWriteArrayList

Java中的CopyOnWriteArrayList

2022-06-13 19:09:47 319

原创 Android Bitmap 理解

一、BitmapBitmap是Android系统中图像处理的最重要类之一。用它可以获取图像信息,对图像进行剪切、旋转、缩放等操作,并可以指定格式保存图像文件。常用方法: public int getDensity():获取图片的像素密度 public void reconfigure(int width, int height, Config config):重新设置图片的宽高及解码格式 public void setWidth(int width) public

2022-05-13 14:27:06 922

原创 Fragment的startActivityForResult和Activity的startActivityForResult的区别

1. 前言Activity、FragmentActivity、Fragment中都有startActivityForResult()方法,也都有用以接收结果的onActivityResult()方法,那他们有什么区别吗?用法上有什么不同吗?之所以注意到这个问题,是因为最近一次在Fragment中使用了getActivity().startActivityForResult()去调用图片选择器,结果发现在Fragment的onActivityResult无法接收到返回的结果。2. 表现假设.

2022-02-16 18:55:46 832

原创 RecyclerView局部刷新机制

之前在使用RecyclerView的遇到过一个问题,使用notifyItemChanged刷新数据的时候会出现重影或者闪烁的现象。这个问题很容易出现,当我们的列表中有进度显示(比如下载),这时候需要不停的更新进度,就需要使用notifyItemChanged使用notifyItemChanged可以只刷新那一个item,这样就避免了像ListView那样全部刷新但是如果使用notifyItemChanged(position),在滑动的时候刷新就会出现重影或者闪烁的问题。解决这个问题很简单,

2022-02-08 11:51:24 3577

原创 对volatile不具有原子性的理解

在阅读多线程书籍的时候,对volatile的原子性产生了疑问,问题类似于这篇文章所阐述的那样。经过一番思考给出自己的理解。我们知道对于可见性,Java提供了volatile关键字来保证可见性、有序性。但不保证原子性。普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。  背景:为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作,但操

2022-01-27 15:08:47 586

原创 Android绘图之Canvas状态保存和恢复

Save函数注释/**Saves the current matrix and clip onto a private stack. <p> Subsequent calls to translate,scale,rotate,skew,concat or clipRect, clipPath will all operate as usual, but when the balancing call to restore() is made, those calls will

2022-01-21 16:15:13 2624

原创 Android广播

1.广播的分类(1)按照发送的方式分类标准广播 是一种异步的方式来进行传播的,广播发出去之后,所有的广播接收者几乎是同一时间收到消息的。他们之间没有先后顺序可言,而且这种广播是没法被截断的。 有序广播 是一种同步执行的广播,在广播发出去之后,同一时刻只有一个广播接收器可以收到消息。当广播中的逻辑执行完成后,广播才会继续传播。(2)按照注册的方式分类动态注册广播 顾名思义,就是在代码中注册的。 静态注册广播 动态注册要求程序必须在运行时才能进行,有一定的局限性,如果我们需要在

2021-12-28 18:33:40 9078 1

原创 解决LiveData数据倒灌/粘性数据

数据倒灌原因原因有很多,比如旋转屏幕导致Activity重建,看官方解释:ViewModel 将数据保留在内存中,这意味着开销要低于从磁盘或网络检索数据。ViewModel 与一个 Activity(或其他某个生命周期所有者)相关联,在配置更改期间保留在内存中,系统会自动将 ViewModel与发生配置更改后产生的新 Activity 实例相关联。也就是说Activity异常销毁然后重建,ViewModel会保存销毁之前的数据,然后在Activity重建完成后进行数据恢复,所以Li..

2021-12-07 11:47:49 4208

原创 Android Jetpack系列之MVVM使用及封装

Android开发架构如果开发过程中大家各自为战,没有统一规范,久而久之,项目代码会变得混乱且后续难以维护。当使用统一的架构模式后,有很多的好处,如:统一开发规范,使得代码整洁、规范,后续易于维护及扩展 提高开发效率(尤其在团队人员较多时) 模块单一职责,使得模块专注自己内部(面向对象),模块间解耦总之,开发架构是前人总结出来的一套行之有效的开发模式,目的是达到高内聚,低耦合的效果,使得项目代码更健壮、易维护。Android中常见的架构模式有MVC(Model-View-Controlle

2021-12-06 16:25:19 593

原创 关于MVVM的一些秘密

前言MVVM作为一种架构模式,在Android中的主要落地实践脱离不开两个核心类LiveData和ViewModel。阅读之前需要你具备使用LiveData和ViewModel的基本使用。有的放矢,带着目的的看这篇文或许你会更有收获。这篇文能帮你解除这些疑惑ViewModel怎么实现多个Fragment之间数据共享? Activity横竖屏切换时,ViewModle是怎么死里逃生的? ViewModleScope是怎么感知组件生命周期而自杀(cancel)? LiveData如何防止内存泄

2021-12-06 15:55:17 386

原创 LiveData数据倒灌与粘性事件

粘性事件事件发送后,观察者才订阅,订阅后会收到之前的事件。当先订阅,后事件发送,protected void setValue(T value) { assertMainThread("setValue"); mVersion++; mData = value; dispatchingValue(null); }这里以setValue来分析,会调用dispatchingValue(),注意这里传的是null。

2021-12-06 15:30:05 2365

原创 AAC-ViewModel实现分析

Jetpack是Google I / O 2017 中引入, 其中的架构组件 Android Architecture Components , 就是我们常说的AAC. 包括Databinding, Lifecycles, LiveData, ViewModel, Navigation, Paging, Room, WorkManager组件. 每个组件都是独立的,你可以使用一个或者组合使用.这里介绍的是 ViewModel 组件, 主要分为 :ViewModel的作用 ViewModel对Con

2021-11-24 17:55:53 526

原创 OnLongClickListener的判断流程

onLongClick()的返回值从View.setOnLongClickListener()说起,setOnLongClickListener()会为View设置一个长按的监听,在长按控件时就能收到事件的回调; mFinishBtn.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) {

2021-11-12 11:53:12 1057

原创 JNI RegisterNatives注册原生方法

除了使用传统方法实现JNI外,也可以使用RegisterNatives实现JNI。和传统方法相比,使用RegisterNatives的好处有三点:C++中函数命名自由,不必像javah自动生成的函数声明那样,拘泥特定的命名方式; 效率高。传统方式下,Java类call本地函数时,通常是依靠VM去动态寻找.so中的本地函数(因此它们才需要特定规则的命名格式),而使用RegisterNatives将本地函数向VM进行登记,可以让其更有效率的找到函数; 运行时动态调整本地函数与Java函数值之间的映射关系

2021-08-03 20:57:25 884

原创 Java方法签名

方法签名的意义对于同名不同类、同类不同名的方法,方法签名的意义并不是很大,但是对于重载方法来说,方法签名的意义就十分巨大了。由于重载方法之间的方法名是相同的,那么我们势必要从构成方法的其他几个要素中找到另一个要素与方法名组成能够唯一标示方法的签名,方法体当然不予考虑。那么就是形参列表和返回值了,但是由于对于调用方法的人来说,方法的形参数据类型列表的重要程度要远远高于返回值,所以方法签名就由方法名+形参列表构成,也就是说,方法名和形参数据类型列表可以唯一的确定一个方法,与方法的返回值一点关系都没有,这是

2021-08-03 20:46:11 8984 2

原创 Java中几种常量池的区分

在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分一下这几个概念。1.全局字符串池(string pool也有叫做string literal pool)全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(记住:string pool中存的是引用值而不是具体的实例对象,

2021-07-16 20:27:09 338

原创 java内存分配详解

对于java程序员来说,在虚拟机的自动内存管理机制下,不需要显式的对new出来的对象进行free和delete操作。但是了解java是如何进行内存分配的,对我们排查错误具有极大的帮助。今天笔者按照所看的书上的内容和自己的理解来简单的谈一下java的内存分配问题。关于java运行时的数据区域,主要涉及以下几个: 程序计数器:它主要存储的是当期线程所执行的字节码的行号等信息,然后字节码解释器根据计数器中存储的内容来选取下一条需要执行的字节码指。因此,可以看出,每条线程都有一个独立的程序计数器,它是线程

2021-07-16 20:17:42 704 1

原创 Android Camera1-Camera2-CameraView和CameraX使用

基础知识Android Framework提供Camera API来实现拍照与录制视频的功能,目前Android有三类API,Camera 此类是用于控制设备相机的旧版 API,现已弃用,在Android5.0以下使用 Camera2 此软件包是用于控制设备相机的主要 API,Android5.0以上使用 CameraX 基于Camera 2 API封装,简化了开发流程,并增加生命周期控制相关开发类android.hardware.camera2 控制相机的核心API,使用它可以实

2021-07-15 17:57:16 5739 2

原创 OKhttp3拦截器——RetryAndFollowUpInterceptor

RetryAndFollowUpInterceptor是什么从名字上就能看出,这个拦截器的作用是用来重试和重定向的,上期分析出拦截器中主要用来执行的方法是intercept()方法,那就废话不多说直接看RetryAndFollowUpInterceptor在intercept()中做了什么。看源码public final class RetryAndFollowUpInterceptor implements Interceptor { ... @Override public

2021-07-09 20:40:58 827

原创 Dialog全屏设置修改状态栏颜色兼容刘海屏

一、Dialog的全屏设置public class FullScreenDialog extends Dialog { public FullScreenDialog(@NonNull Context context) { super(context); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstan

2021-06-30 20:08:49 2563 1

原创 ThreadLocal的内存泄露?什么原因?如何避免?

ThreadLocal的内存泄露?什么原因?如何避免?前言在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露、强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这样情况发生,增强系统的健壮性。内存泄露内存泄露为程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光,广义并通俗的说,就是:不再会被使用的对象或者变量占用的内存...

2021-06-04 11:17:25 166

原创 理解Android缓存机制——LruCache

关于Android的三级缓存,其中主要的就是内存缓存和硬盘缓存。这两种缓存机制的实现都应用到了LruCache算法,今天我们就从使用到源码解析,来彻底理解Android中的缓存机制。一、Android中的缓存策略一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的。当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓存并添加新的缓存。因此LRU(Least .

2021-06-04 11:03:50 343

原创 JVM之类加载机制

一个Java类从被加载到虚拟机内存到被卸载出内存为止,生命周期一共包括如下几个阶段:加载(Loading) 验证 (Verfication) 准备 (Preparation) 解析 (Resolution) 初始化 (Initialization) 使用 (Using) 卸载 (Unloading)其中验证、准备、解析这个3个部分统称为链接(Linking)。加载、验证、准备、初始化和卸载这5个阶段开始执行的顺序是一定的,但不意味着这几个阶段是分开执行的,这些阶段通常是相互交.

2021-04-28 11:30:11 139

原创 Rxjava的OnErrorNotImplementedException异常分析

通过名字我们可以发现这个是因为onError没有实现导致的异常,那么为什么不实现onError会这样呢这里写了两个demo方法:使用Observer做为订阅者使用Consumer做为订阅者二者都在onNext函数中进行了异常的抛出。第一种方式可以正常的回调onError 并打印信息第二种方式直接崩溃-----堆栈信息中正是OnErrorNotImplementedExceptionConsumer是Observer的简化版 上面的demo我...

2021-04-21 11:11:19 3355

原创 Handler的同步屏障机制

1. Handler中异步消息  在介绍同步屏障的时候,我们先来看Handler中的异步消息。通常情况下,我们使用Handler向任务队列添加的Message都是同步的,如果我们想要添加一个异步的Message,由如下两个方式:Handler的构造方法有一个async参数,我们在new Handler的时候传为true就行了,后续使用该Handler添加的Message都是异步。 private boolean enqueueMessage(MessageQueue queue.

2021-03-17 16:13:20 352

原创 System.out.println()影响内存的可见性

一、问题public class TestVolatile implements Runnable { private boolean flag = false; public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } @Override public void run().

2021-03-05 16:20:08 304 2

原创 位运算、补码、反码、原码

正数位移运算Java中有三个位移运算:• <<:左移 • >>:右移 • >>>:无符号右移我们直接看一下Demo:System.out.println(2 << 1); // 4System.out.println(2 >> 1); // 1System.out.println(2 >>> 1); // 1System.out.println(-2 << 1);

2021-02-24 19:43:58 312

原创 更换 Android 原生 Toast 的样式

Toast 使用的 Layout在源码中写到:View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);也就是:com.android.internal.R.layout.transient_notification其布局文件如下:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/andr

2021-01-22 11:51:51 2597 2

原创 HTTP请求方式GET与HEAD的区别

GET请求从服务器上获取资源200:在响应体中放有数据。HEAD请求HEAD方法与 GET 方法类似,也是请求从服务器获取资源,服务器的处理机制也是一样的,但服务器不会返回请求的实体数据,只会传回响应头,也就是资源的“元信息”。HEAD 方法可以看做是 GET 方法的一个“简化版”或者“轻量版”。因为它的响应头与 GET 完全相同,所以可以用在很多并不真正需要资源的场合,避免传输 body 数据的浪费。比如,想要检查一个文件是否存在,只要发个 HEAD 请求就可以了,没有必要用 GET 把

2021-01-21 17:44:45 2118

原创 移动 APP 网络优化概述

一般开发一个 APP,会直接调用系统提供的网络请求接口去服务端请求数据,再针对返回的数据进行一些处理,或者使用AFNetworking/OKHttp这样的网络库,管理好请求线程和队列,再自动做一些数据解析,就结束了。但对于一些大型 APP,还会想针对网络的一些问题进行进一步优化,包括:速度:网络请求的速度怎样能进一步提升? 弱网:移动端网络环境随时变化,经常出现网络连接很不稳定可用性差的情况,怎样在这种情况下最大限度最快地成功请求? 安全:怎样防止被第三方窃听/篡改或冒充,防止运营商劫持,同时又

2021-01-12 16:21:42 467

原创 Scroller的原理剖析及使用

一、前言什么是弹性滑动?就是一个View是在一段时间内完成滑动的,而不是一瞬间完成的,从原理来说,将一次滑动分解为若干个小的滑动,在一小段时间内完成,那么连贯起来就能看做一次弹性滑动。本文将以弹性滑动方式之一:Scroller来讲述其用法及原理。二、Scroller原理剖析我们知道View自带的scrollTo和scrollBy能实现View内容的滑动,而Scroller则是基于这两个方法而产生的一个辅助类,能使scrollTo/By的滑动变成弹性滑动一样,所以Scroller说到底也是用了sc

2020-12-10 11:07:22 460

原创 Choreographer机制和卡顿优化

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

2020-12-03 17:50:33 2066

原创 Android Studio无法执行Java类的main方法问题及解决方法

Android Studio升级到哦最新版3.6.1后,新建了个项目,发现无法执行Java类的main方法。试了网上的各种方法,比如切换gradle离线模式、gradle.properties中添加android.enableAapt2=false等,我还尝试了重新情况Gradle缓存、重新下载gradle等方式,都没用。环境android studio版本:3.6.1gradle版本:5.6.4gradle插件版本:3.6.1错误提示11:41:35 PM: Executing ta

2020-11-27 20:24:39 1982

空空如也

空空如也

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

TA关注的人

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