- 博客(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
原创 Android系统启动开篇
当电源键被按下时,芯片将会从固化在ROM中的代码开始运行,直到启动整个系统。具体流程如下:按下电源→引导程序Bootloader→加载Linux内核(寻找init进程代码)→执行init进程→启动Zygote进程→启动SystemServer进程→启动launcher进程,流程图下图所示。
2024-08-13 08:02:28
2117
原创 面向对象的四大特性:封装、抽象、继承、多态
封装主要讲如何隐藏信息、保护数据,那抽象就是讲如何隐藏方法的具体实现,让使用者只需要关心方法提供了哪些功能,不需要知道这些功能是如何实现的。抽象可以通过接口类或者抽象类来实现,但也并不需要特殊的语法机制来支持。抽象存在的意义,一方面是提高代码的可扩展性、维护性,修改实现不需要改变定义,减少代码的改动范围;另一方面,它也是处理复杂系统的有效手段,能有效地过滤掉不必要关注的信息。
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
原创 类与类之间的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
原创 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
原创 接口和抽象类
接口和抽象类1、抽象类要被子类继承,接口要被类实现。2、接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。3、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。4、接口是设计的结果,抽象类是重构的结果。5、抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。6、抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。7、抽象类主要用来抽象类别...
2019-10-05 21:15:19
328
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人