自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

bobolan

记录、学习、分享

  • 博客(43)
  • 收藏
  • 关注

原创 解决AS Could not install Gradle distribution from ‘https://services.gradle...Connect timed out的异常

在使用Android Studio时,经常会遇到与Gradle相关的问题。其中,在加载Gradle时,无论是首次下载Gradle还是导入Gradle,都可能会遭遇报错。尤其是当下载过程中出现网络问题时,很容易导致下载超时而报错,给开发者带来极大的困扰。

2025-01-03 22:30:00 1575

原创 使用 ConstraintLayout 实现灵活的相对定位与偏移布局

在 Android 应用开发中,使用合理的布局方式可以极大地提高应用的用户体验和性能。是一种强大且灵活的布局方式,它允许我们通过“约束”来控制控件的位置、大小及相对关系,实现更加复杂的 UI 布局,而不必增加层级嵌套。这篇文章将为刚接触 ConstraintLayout 的开发者详细介绍如何使用相对定位和偏移属性来布局控件。尽量减少嵌套布局,保持布局简单。使用 Bias 和 Margin进行微调,让布局适配各种屏幕。多用 Chains 和 Barrier创建灵活的链式布局和动态边界。

2024-11-12 06:00:00 935

原创 如何解决git@github.com: Permission denied (publickey)异常

权限被拒绝(公钥)。致命错误:无法从远程存储库读取。请确保您具有正确的访问权限并且存储库存在。

2024-08-23 11:54:48 1366 1

原创 leetcode-合并两个有序数组

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

2024-08-21 23:13:30 318

原创 JVM 运行时内存结构简介

JVM(Java 虚拟机)的运行时内存结构在 Java 程序的运行中起着关键支撑作用。而在 Android 系统中,虽然没有直接使用传统的 JVM,但 Android 运行时环境(AndroidRuntime)借鉴了许多 JVM 的设计理念和机制。了解 JVM 的运行时内存结构,不仅有助于 Java 开发者更好地理解 Java 程序的运行机制,对于 Android 开发者来说,也能更深入地理解 Android 系统中应用程序的运行原理,优化程序性能,以及排查内存相关的问题。

2024-08-21 18:21:46 935

原创 Android类加载机制简介

随着 Android 技术的不断发展,对其内部机制的探索也日益深入。类加载机制作为 Android 运行时环境的核心组成部分之一,影响着应用的性能、安全性以及可扩展性。通过对 Android 类加载机制的研究,开发者可以更好地优化代码结构、提高应用的启动速度、解决潜在的安全问题,并实现更加灵活的功能扩展。本文旨在对 Android 类加载机制进行简要介绍,帮助读者建立起对这一重要概念的初步认识,为进一步深入学习和实践 Android 开发奠定基础。

2024-08-20 23:56:39 1132

原创 Android内存优化之OnTrimMemory简介

在Android开发中,内存管理是一个至关重要的课题。特别是在系统内存紧张时,如何有效地释放资源以避免应用被系统杀死,是每个开发者需要考虑的问题。其中,OnTrimMemory 回调是 Android 4.0 之后提供的一个API,这个 API 是提供给开发者的,它的主要作用是提示开发者在系统内存不足的时候,通过处理部分资源来释放内存,从而避免被 Android 系统杀死。

2024-08-19 21:39:21 1570

原创 如何确定TLS session 复用成功

如何确定https请求的tls复用是否成功

2024-08-18 09:10:54 473

原创 Android系统启动开篇

当电源键被按下时,芯片将会从固化在ROM中的代码开始运行,直到启动整个系统。具体流程如下:按下电源→引导程序Bootloader→加载Linux内核(寻找init进程代码)→执行init进程→启动Zygote进程→启动SystemServer进程→启动launcher进程,流程图下图所示。

2024-08-13 08:02:28 2117

原创 如何通过adb命令查找android应用进程中包含的所有线程?

2、根据pid查询出当前进程所有的线程。1、根据应用包名查找对应的pid。

2024-05-21 08:27:37 627

原创 面向对象的四大特性:封装、抽象、继承、多态

封装主要讲如何隐藏信息、保护数据,那抽象就是讲如何隐藏方法的具体实现,让使用者只需要关心方法提供了哪些功能,不需要知道这些功能是如何实现的。抽象可以通过接口类或者抽象类来实现,但也并不需要特殊的语法机制来支持。抽象存在的意义,一方面是提高代码的可扩展性、维护性,修改实现不需要改变定义,减少代码的改动范围;另一方面,它也是处理复杂系统的有效手段,能有效地过滤掉不必要关注的信息。

2023-11-30 08:00:00 638

原创 Android Studio Error “Unsupported class file major version 61“---异常信息记录

问题出在JAVA 17上,并且使用的Gradle JDK是:Android Studio java home版本17.0.1将其更改为:Android Studio默认JDK版本11.0.10 即可解决。

2023-11-18 08:00:00 2007 1

原创 MAC 如何解决GitHub下载速度慢的问题

解决github下载速度慢的方法很多,本文主要介绍通过Git镜像的方式解决下载慢的问题。主要步骤有:1、找到gitconfig文件, 2、通过git命令查看当前生效的config 配置 3、使用git config命令编辑并添加国内镜像源。

2023-09-28 17:37:04 1826

原创 Android Studio log的快捷键和使用

输入logi,然后按下Tab键,会自动补全一条info级别的打印日志。输入logw,按下Tab键,会自动补全一条warn级别的打印日志,以此类推。

2023-08-01 07:00:00 417 1

原创 Android 四大组件之广播

在Android中, 什么是广播?、系统广播、自定义广播、本地广播、广播的注册

2023-07-09 15:14:09 6564 6

原创 类与类之间的6种交互关系

一、概述类与类之间都有哪些交互关系呢?UML 统一建模语言中定义了六种类之间的关系。它们分别是:泛化、实现、关联、聚合、组合、依赖。二、详解1. 泛化(Generalization)可以简单理解为继承关系。具体到 Java 代码就是下面这样:public class A { ... }public class B extends A { ... }2. 实现(Realization)一般是指接口和实现类之间的关系。具体到 Java 代码就是下面这样:public interface A

2022-01-08 18:05:14 1327

原创 结构化思维

什么是结构化思维?那么到底是什么是结构化思维呢?简单来说,结构化思维的定义就是:逻辑+套路。表达要有逻辑所谓逻辑是指我们的结构之间必须是有逻辑关系的。例如,你说话的时候用“第一、第二、第三”这个逻辑顺序是合理的,但是,用“第一,第二,第四”就会显得很奇怪。当然,即使你用了”一、二、三”,也不一定就意味着你的内容有逻辑关系。想让内容有逻辑关系,我们要学会四种组织思想的逻辑关系:1)演绎(因果)顺序:“大前提、小前提、结论”的演绎推理方式就是演绎顺序。比如,经典三段论:所有人都要死,苏格拉底是人,苏格拉

2021-01-31 12:47:11 1082

原创 重构方法_在对象之间搬移特性

Move Method(搬移函数)Move Field(搬移字段)EXtract Class(提炼类)Inline Class(将类内联化)Hide Delegate(隐藏“委托关系”)Remove Middle Man(移除中间人)Introduce Foreign Method(引入外加函数)Introduce Local Extension(引入本地扩展)...

2021-01-23 12:29:54 298

原创 重构方法_重新组织函数

概述1、重构手法中很大一部分是对函数进行整理,使之更恰当地包装代码。几乎所有时刻,问题都源于Long Method(过长函数)。这很讨厌,因为它们往往包含太多信息,这些信息又被函数错综复杂的逻辑掩盖,不易鉴别。对付过长函数,一项重要的重构手法就是Extract Method(提炼函数),它把一段代码从原先函数中提取出来,放进一个单独函数中。Inline Method(内联函数)正好相反:将一个函...

2021-01-17 17:45:59 1631

原创 设计模式_单例模式

单例模式概述1、核心:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。2、单例模式的优点:1)由于单例模式只生成一个实例对象,减少了系统的性能开销。当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决2)单例模式可以在系统设置全局的访问点,优化共享资源的访问,例如可以设计一个单例类,负责所...

2020-02-22 09:49:53 142

原创 重学JAVA_字符集与编码

概念解释编码:在Java中将字符转化为字节的过程称为编码。解码:在Java中将字节转化为字符的过程称为解码。补充(定义):编码是信息从一种形式转化为另一种形式的过程; 解码则是编码的逆过程。...

2020-01-23 15:26:11 379

原创 UML使用

在线UML博客:https://blog.youkuaiyun.com/chktsang/article/details/79697747UML在线编辑:https://online.visual-paradigm.com/cn/diagrams/features/uml-tool/UML中描述对象和类之间相互的关系,常用以下几种方式表示:1、依赖(Dependency):表示的是类之间的调用关系。UM...

2020-01-16 20:54:31 566

原创 Android内存泄漏分析

摘要:内存泄漏,即Memory Leak,指程序中不再使用到的对象因某种原因而无法被GC正常回收。它会导致一些不再使用到的对象没有及时释放,这些对象占据着宝贵的内存空间,很容易导致后续分配内存的时候,内存空间不足而出现OOM(内存溢出)。无用对象占据的空间越多,那么可用的空闲空间也就越少,GC就会更容易被触发,GC进行时会停止其他线程的工作,因此有可能造成卡顿等情况。Java内存分配策略Ja...

2020-01-09 22:01:53 211

原创 重学JAVA_IO流——File类

概述

2020-01-09 21:59:32 201

原创 Git版本控制工具——常用命令(二)

安装git和基本用法1、从git 官网下载程序,默认安装即可。2、设置账号和邮箱关联,账号和邮箱可以是码云、GitLab…的账号都行:$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"3、选择合适地方,创建空目录:$ m...

2019-10-24 21:58:16 180

原创 操作系统概述

操作系统(Operating System, OS)是计算机系统中必不可少的核心系统软件,其他软件(如编辑程序、汇编程序、编译程序、数据库管理系统等系统软件,以及大量的应用软件)是建立在操作系统的基础上,并在操作系统的统一管理和支持下运行。操作系统是用户与计算机之间的接口,用户可以通过操作系统提供的功能访问计算机系统中的软硬件资源。一、操作系统的作用、特征与功能操作系统有效地组织和管理系统中的...

2019-10-21 23:00:22 409

原创 单元测试

一、什么是单元测试?单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。二、单元测试的好处?1)减少bug一个机器,由各种细小的零件组成,如果其中某件零件坏了,机器运行故障。必须保证每个零件都按设计图要求的规格,机器才能正常运行。一个可单元测试...

2019-10-18 23:41:04 15531 1

原创 Thread类的使用

一.线程的状态在学习Thread类中的具体方法之前,先了解一下线程有哪些状态,这个将会有助于后面对Thread类中的方法的理解。线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、time waiting、waiting、消亡(dead)。当需要新起一个线程来执行某个子任务时...

2019-10-17 22:36:02 277

原创 Git版本控制工具——背景介绍(一)

一.Git是什么版本控制工具!Git是目前世界上最先进的分布式版本控制系统(没有之一)。这个软件用起来就应该像这个样子,能记录每次文件的改动这样,你就结束了手动管理多个“版本”的史前时代,进入到版本控制的20世纪。二、Git发展史cvs --svn在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!你也许会想,为什...

2019-10-16 22:52:54 486

原创 MessageQueen源码分析

一、由于MessageQueen是用来存放Message的,那么是如何存储Message的呢?由于Handler使用Post()方法将Message传递到MessageQueen中,在MessageQueen中会使用enqueueMessage()方法存储Message,其实现的方式是通过单链表的数据结构来存储消息列表boolean enqueueMessage(Message msg, lo...

2019-10-15 23:02:50 441

原创 Handler源码分析

一、Handler的创建Handler的创建会关联一个Looper对象,而Looper对象是关联着MessageQueen对象,所以在Handler创建时候,取出Looper和MessageQueenpublic Handler(Callback callback, boolean async) { ... //取出Looper mLooper = Looper.myL...

2019-10-15 22:38:35 226

原创 Looper源码分析

一、为什么Handler可以在主线程中直接可以使用呢?因为主线程(UI线程)的Looper在应用程序开启时创建好了,即在ActivityThread.main方法中创建的,该函数为Android应用程序的入口public static void main(String[] args) { ... Process.setArgV0("<pre-initialized>");...

2019-10-14 23:16:29 374

原创 IO流的概念和工作原理

流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出在IO流里,输入输出分为4步:格式化/解析,缓冲,编码转换和传递。格式化/解析:在内部数据表示(以字节为单位)与外部数据表示(以字符为单位...

2019-10-13 22:54:05 1045

原创 优快云 Markdown编辑器——文本颜色、大小、字体设计

博客文本设计参考字体效果十六进制颜色值背景效果Darkorange#FF8C00 关键词DodgerBlue#1E90FF 概念定义Blue#0000FF rgb(0, 0, 255)Purple#800080 rgb(128, 0, 128)Green#008000 rgb(0, 128, 0)Lime#00F...

2019-10-13 16:59:37 209

原创 Java学习路线——Java基础

Java基础第一部分:Java开发介绍DOS常用命令JVM、JRE、JDK之间的关系Java开发环境的搭建:安装JDK,配置环境变量Java入门程序(Java的开发流程)Java的注释,标识符、标识符的命名规范Java基本数据类型变量和常量的定义及初始化Java的运算符运算符的优先级Java分支语句之if…else循环的嵌套...

2019-10-12 22:59:46 140

原创 Android消息机制Looper、Handler、MessageQueen(一)

一、消息机制相关概念的解释1、主线程(UI线程)定义:当程序第一次启动时,Android会同时启动一条主线程(Main Thread)作用:主线程主要负责处理与UI相关的事件2、Message(消息)定义:Handler 接收和处理的消息对象(Bean对象)作用:通信时相关信息的存放和传递3、ThreadLocal定义:线程内部的数据存储类作用:负责存储和获取本线程的Looper...

2019-10-11 23:01:03 237

原创 网络编程--什么是Socket?

序言传输层实现端到端的通信,因此,每一个传输层连接有两个端点。那么,传输层连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。传输层连接的端点叫做套接字(socket)。根据RFC793的定义:端口号拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端...

2019-10-10 23:02:10 840

原创 进程/线程

什么是进程?什么是线程?两者间的关系是怎样的?

2019-10-09 23:10:33 114

原创 接口和抽象类

接口和抽象类1、抽象类要被子类继承,接口要被类实现。2、接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。3、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。4、接口是设计的结果,抽象类是重构的结果。5、抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。6、抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。7、抽象类主要用来抽象类别...

2019-10-05 21:15:19 328

原创 java源文件运行机制

java运行机制

2019-05-19 20:48:59 334

空空如也

空空如也

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

TA关注的人

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