自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ForgetSky的博客

ForgetSky的博客

  • 博客(93)
  • 资源 (2)
  • 收藏
  • 关注

原创 DNS解析流程

1、在浏览器中输入www . qq .com 域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资...

2021-06-28 00:28:50 957

原创 Android性能优化--卡顿优化与布局优化

布局优化:​​减少不必要的背景色,去掉子控件中和父控件一样的背景色;去掉父控件中被子控件完全覆盖的背景色 减少布局层级:使用约束布局ConstraintLayout;使用include和merge增加复用,减少层级 使用ViewStub按需加载,更加轻便 能用LinearLayout和FrameLayout,就不要用RelativeLayout,因为RelativeLayout控件相对比较复杂,测绘也想要耗时。绘制优化:onDraw中不要创建新的局部对象 onDraw方法中不要做耗时的任务

2021-05-14 17:47:06 359

原创 Android性能优化——内存优化

Android内存优化大盘点

2021-05-12 20:09:55 2180

原创 Android性能优化——稳定性优化

APP 稳定性的维度app 稳定一般指的是 app 能正常运行, app 不能正常运行的情况分为两大类,分别是 Crash 和 ANR。Crash:运行过程中发生的错误,是无法避免的。ANR:应用再运行时,由于无法在规定的时间段内响应完,系统做出的一个操作。如何治理Crash应用发生 Crash 是由于应用在运行时,应用产生了一个未处理的异常(就是没有被 try catch 捕获的异常)。这会导致 app 无法正常运行。如果需要解决的话,就需要知道这个未处理的异...

2021-05-11 15:37:53 1485

转载 Android 平台 Native 代码的崩溃捕获机制及实现

https://github.com/xroche/coffeecatchhttps://github.com/ivanarh/jndcrashhttps://github.com/mingfeng002/ndcrashhttps://zhuanlan.zhihu.com/p/27834417?utm_medium=social&utm_source=weibo一、背景在Android平台,native crash一直是crash里的大头。native crash具有上下文不全、

2021-05-11 10:27:59 594

转载 Google等国际大公司均开始支持的HTTP3到底是什么鬼?

最近一段时间以来,关于HTTP/3的新闻有很多,越来越多的国际大公司已经开始使用HTTP/3了。所以,HTTP/3已经是箭在弦上了,全面使用只是个时间问题,那么,作为一线开发者,我们也是时候了解下到底什么是HTTP/3,为什么需要HTTP/3了。那么,本文就来讲解一下到底什么是HTTP/3?他用到了哪些技术?解决了什么问题?HTTP/2 存在的问题在撰写本文之前,我专门写了一篇文章《HTTP/2做错了什么?刚刚辉煌2年就要被弃用了?》分析HTTP/2存在的问题以及背后的原...

2021-05-07 18:52:42 282

原创 多线程下载与断点续传

1. 为什么要使用断点续传在进行数据上传的时候可能是多线程操作,很多图像数据同时做上传或者单一的图像,如果图像比较多或者单一图像数据比较大,自然不希望失败一次或者暂停一次之后完全重传,有断点续传功能可以节省网络流量和节省用户时间,体验自然比你一次次的重传好很多。2. 什么是断点续传所谓断点续传,也就是要从文件已经下载的地方开始继续下载。HTTP/1.1 开始就支持了。一般断点下载时才用到 Range 和 Content-Range 实体头。2.1什么是Range?当用户在听一首歌的时候,

2021-05-07 15:52:43 928

原创 字符编码Unicode、UTF-8 ...

开始计算机只在美国用。八位的字节一共可以组合出256(2的8次方)种不同的状态。他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作:遇上0×10, 终端就换行;遇上0×07, 终端就向人们嘟嘟叫;遇上0x1b, 打印机就打印反白的字,或者终端就用彩色显示字母。他们看到这样很好,于是就把这些0×20以下的字节状态称为”控制码”。他们又把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第12

2021-05-07 11:58:43 263

原创 网络通信知识总结

一、网络分层模型当前存在三种划分网络模型的方式:OSI七层模型 TCP/IP四层模型 五层模型网络模型一般是指OSI七层参考模型和TCP/IP四层参考模型,前两个模型在网络中应用最为广泛;而五层模型是业界对OSI和TCP/IP的综合而产生的非官方协议模型,与四层协议主要区别是把网络接口分为了数据链路层和物理层。1、OSI七层模型OSI七层协议模型主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络

2021-05-06 19:59:04 4494 2

原创 开发编译签名混淆

AndroidStudio的build按钮后发生了什么

2021-04-25 14:58:20 74

原创 Android自定义View

为什么要自定义View大多数情况下,开发者常常会因为下面四个原因去自定义View:让界面有特定的显示风格、效果 让控件具有特殊的交互方式 优化布局 封装让界面有特定的显示风格、效果默认情况下,Android系统为开发者提供了很多控件,但有时,这并不能满足开发者的需求。例如,开发者想要用一个饼状图来展示一组数据,这时如果用系统提供的View就不能实现了,只能通过自定义View来实现。让控件具有特殊的交互方式默认情况下,Android系统为开发者提供的控件都有属于它们自己的特定的交互

2021-04-15 17:25:51 285

原创 View的构造函数

View的构造函数构造函数参数最多有四个。View(Context)View(Context, AttributeSet)View(Context, AttributeSet, defStyleAttr)View(Context, AttributeSet, defStyleAttr, defStyleRes) Context- View中随处都会用到。 AttributeSet- XML属性(当从XML inflate的时候)。 int defStyleAtt..

2021-04-15 16:43:57 310

原创 View的渲染机制

首先,用一句话来概括一下Android应用程序显示的过程:Android应用程序调用SurfaceFlinger服务把经过测量、布局和绘制后的Surface渲染到屏幕上。SurfaceFlinger:Android系统服务,负责管理Android系统的帧缓冲区,即显示屏幕。Surface:Android应用的每个窗口对应一个画布(Canvas),即Surface,可以理解为Android应用程序的一个窗口。Android应用程序的显示过程包含了两个部分(应用侧绘制、系统侧渲染)、两个机制(进程.

2021-04-14 19:35:28 646

原创 Flutter介绍

跨平台技术简介针对原生开发面临问题,人们一直都在努力寻找好的解决方案,而时至今日,已经有很多跨平台框架,根据其原理,主要分为三类:基于WebView(Cordova、AppCan)这类框架主要原理就是利用Android和 iOS 上的 webview 容器,APP 能够执行 html、css 和 js 脚本,展示 web 页面。如果需要原生功能就添加 bridge 供 javascript 调用。具有开发效率高、跨平台、支持动态发布等特点,它是目前应用最广泛最成熟的一种方案。基于WebView的

2021-04-14 14:36:10 653

原创 View的绘制流程

1.整体流程View 绘制流程从ViewRootImpl的setView()方法开始//ViewRootImpl public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) { // Schedule the first layout -before- adding to the window // mana

2021-04-12 11:02:44 232

原创 Activity的启动流程

1. Application启动流程AMS通过socket请求zygote创建进程, 然后反射创建ActivityThread,调用其main()方法public final class ActivityThread extends ClientTransactionHandler { //初始化ApplicationThread final ApplicationThread mAppThread = new ApplicationThread(); //初始

2021-04-02 18:33:01 558

原创 View事件分发

1.事件的源头在哪里Android系统中将输入事件定义为InputEvent,而InputEvent根据输入事件的类型又分为了KeyEvent和MotionEvent,前者对应键盘事件,后者则对应屏幕触摸事件,这些事件统一由系统输入管理器InputManagerService进行分发。在 SystemServer.startOtherServices中会启动 IMS(InputManagerService)和WMS(WindowManagerService),InputManagerService会开启

2021-04-01 13:18:33 1431 4

原创 android依赖包的maven私服发布及使用

1. 依赖包的发布(1)在待发布的module中build.gradle中的添加以下配置:apply plugin: 'com.android.library'android { compileSdkVersion 30 buildToolsVersion "29.0.3" defaultConfig { }}dependencies { implementation fileTree(dir: "libs", include:.

2021-03-30 18:44:22 301

原创 设计模式(二十三)—— 解释器模式

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式(Interpreter)是一种针对特定问题设计的一种解决方案。例如,匹配字符串的时候,由于匹配条件非常灵活,使得通过代码来实现非常不灵活。举个例子,针对以下的匹配条件:以+开头的数字表示的区号和电话号码,如+861012345678; 以英文开头,后接英文和数字,并以.分隔的域名,如www.liaoxuefeng.com; 以/开头的文件路径,如/path/to/file.txt; .

2021-03-26 19:03:12 130

原创 设计模式(二十二)—— 中介者模式

模式的定义与特点中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。中介者模式是一种对象行为型模式,其主要优点如下。类之间各司其职,符合迪米特法则。 降低了对象之间的耦合性,使得对象易于独立地被复用。 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。其主要缺点是:中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同

2021-03-26 18:42:53 53

原创 设计模式(二十一)—— 访问者模式

模式的定义与特点访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。访问者(Visitor)模式是一种对象行为型模式,其主要优点如下。扩展性好。能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。 复用性好。可以通过访问者来定义整个对象结构通用的功能,从而提高系统的复

2021-03-26 18:16:11 582

原创 设计模式(二十)—— 状态模式

状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。状态模式是一种对象行为型模式,其主要优点如下。结构清晰,状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。 将状态转换显示化,减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。 状态类职责明确,有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。状

2021-03-26 16:44:37 89

原创 设计模式(十九)—— 备忘录模式

模式的定义与特点备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。备忘录模式是一种对象行为型模式,其主要优点如下。提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录

2021-03-26 00:32:00 55

原创 设计模式(十八)—— 命令模式

命令模式的定义与特点命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令模式的主要优点如下。通过引入中间件(抽象接口)降低系统的耦合度。 扩展性良好,增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,且满足“开闭原则”。其缺点是:可能产生大量具体的命令类

2021-03-26 00:20:21 32

原创 设计模式(十七)—— 责任链模式

在现实生活中,一个事件需要经过多个对象处理是很常见的场景。例如,采购审批流程、请假流程等。公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这无疑增加了难度。在计算机软硬件中也有相关例子,如总线网中数据报传送,每台计算机根据目标地址是否同自己的地址相同来决定是否接收;还有异常处理中,处理程序根据异常的类型决定自己是否处理该异常;模式的定义与特点责任链(Chain

2021-03-26 00:05:44 88

原创 设计模式(十六)—— 迭代器模式

在现实生活以及程序设计中,经常要访问一个聚合对象中的各个元素,如“数据结构”中的链表遍历,通常的做法是将链表的创建和遍历都放在同一个类中,但这种方式不利于程序的扩展,如果要更换遍历方法就必须修改程序源代码,这违背了 “开闭原则”。既然将遍历方法封装在聚合类中不可取,那么聚合类中不提供遍历方法,将遍历方法由用户自己实现是否可行呢?答案是同样不可取,因为这种方式会存在两个缺点:暴露了聚合类的内部表示,使其数据不安全; 增加了客户的负担。“迭代器模式”能较好地克服以上缺点,它在客户访问类与聚合类之间插

2021-03-25 20:49:29 71

原创 设计模式(十五)—— 模板方法模式

在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。这样的例子在生活中还有很多,例如,一个人每天会起床、吃饭、做事

2021-03-23 18:50:35 86

原创 设计模式(十二)—— 享元模式

在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。例如,围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网中的路由器、交换机和集线器,教室里的桌子和凳子等。这些对象有很多相似的地方,如果能把它们相同的部分提取出来共享,则能节省大量的系统资源,这就是享元模式的产生背景。享元模式的定义与特点享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少

2021-03-23 01:07:12 119

原创 设计模式(十一)—— 组合模式

在现实生活中,存在很多“部分-整体”的关系,例如,学习用品中的书与书包、生活用品中的衣服与衣柜、以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。组合模式的定义与特点组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访

2021-03-23 00:48:30 113

原创 设计模式(十)—— 桥接模式

在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。桥接模式的定义与特点桥接(Bridge)模式的定义如下:将抽象与实现分

2021-03-23 00:28:24 98

原创 设计模式(九)—— 外观模式

外观模式的定义与特点外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。在日常编码工作中,我们都在有意无意的大量使用外观模式。只要是高层模块需要调度多个子系统(2个以上的类对象),我们都会自觉地创建一个新的类封装这些子系统,提供精简的接口,让高层模块可以更加容易地间接调用这些子系统的功能。尤其是现阶段各种第三方

2021-03-22 23:44:50 66

原创 设计模式(七)—— 装饰器模式

装饰器模式的定义与特点装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。装饰器模式的主要优点有:不改变原类文件。 不使用继承。 动态扩展。其主要缺点是:装饰器模式会增加许多子类,过度使用会增加程序得复杂性。装饰器模式的结构与实现1. 模式的结构装饰器模式主要包含以下角色。抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。 具体构件(Concre

2021-03-22 00:13:57 370

原创 Android API 28+ View监听按键事件的处理方式

API28之前:view.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { return true; }});API28与28+:ViewCompat.addOnUnhandledKeyEventListen.

2021-03-20 23:01:28 384

原创 Java集合

1. 概述List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口Set下有HashSet,LinkedHashSet,TreeSetList下有ArrayList,Vector,LinkedListMap下有Hashtable,LinkedHashMap,HashMap,TreeMapCollection接口下还有个Queue接口,有PriorityQueue类2.Connection接口List 有序,可重复ArrayList优点: .

2021-03-08 20:09:42 107

原创 Java线程池

创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用请求的时间和资源要多的多。如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。这就引入了线程池概念。线程池的优点:1.重用线程池中的线程,减少因对象创建,销毁所带来的性能开销;2.能有效的控制线程的最大并发数,提高系统资源利用率,同时避免过多的资源竞争,避免堵塞;3.能够多线程进行简单的管理,使线程的使用简单、高效。1. 线程池框架Executorjava中的线程

2021-03-08 16:42:40 60

原创 java多线程同步,线程安全--一网打尽

线程同步的基础是java内存模型,如果对java内存模型还不了解,需要先了解一下1. volatilevolatile的特性Java内存模型对volatile专门定义了一些特殊的访问规则,当一个变量定义为volatile之后,它将具备两种特性。保证此变量对所有线程的可见性,即当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。而普通变量不能做到这一点,普通变量的值在线程间传递均需要通过主内存来完成,例如,线程A修改一个普通变量的值,然后向主内存进行回写,另外一条线程B在线程A回

2021-03-08 01:11:22 258 1

原创 java线程--一网打尽

1. 概述进程与线程几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程。当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程。进程:进程是指处于运行过程中的程序,并且具有一定的独立功能。进程是系统进行资源分配和调度的一个单位。当程序进入内存运行时,即为进程。进程的三个特点:1:独立性:进程是系统中独立存在的实体,它可以独立拥有资源,每一个进程都有自己独立的地址空间,没有进程本身的运行,用户进程不可以直接访问其他进程的地址空间。.

2021-03-03 18:43:31 99 1

原创 java垃圾回收

1. 为什么需要垃圾回收  如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。2.怎么定义垃圾既然我们要做垃圾回收,首先我们得搞清楚垃圾的定义是什么,哪些内存是需要回收的。引用计数算法引用计数算法(Reachability Counting)是通过在对象头中分配一个空间来保存该对象被引用的次数(Reference Count)。如果该对象被其它对象引用,则它的引用计数加.

2021-03-03 18:08:31 313 1

原创 java内存模型

Java内存模型(Java Memory Model,JMM)是Java虚拟机规范定义的,用来屏蔽掉Java程序在各种不同的硬件和操作系统对内存的访问的差异。常常和Java内存结构混淆,这是两个不同的概念。Java内存结构是指 JVM运行时将数据分区域存储 ,简单的说就是不同的数据放在不同的地方。通常又叫运行时数据区域。1、为什么要有Java内存模型?简单的说是屏蔽硬件的差异。Java虚拟机规范中试图定义一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异。——《深入理解Ja.

2021-03-03 16:57:38 168 1

原创 java内存结构

Java内存结构是指 JVM运行时将数据分区域存储 ,简单的说就是不同的数据放在不同的地方。1.8 之前:JDK1.8(含)之后:区别就是 1.8有一个元数据区替代方法区了。JDK 1.7 其实是并没完全移除方法区,但是不会像1.6以前报 “java.lang.OutOfMemoryError: PermGen space”,而是报 java.lang.OutOfMemoryError: Java heap space1.7部分内容(比如 常量池、静态变量有方法区转移到了堆)

2021-03-03 15:56:12 200 1

C++课程设计-学生成绩管理系统

C++课程设计-学生成绩管理系统,实验报告,包含代码

2014-07-04

数字闹钟课程设计所有资料

数字闹钟课程设计所有资料 protues仿真图 完整终结版

2014-07-04

空空如也

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

TA关注的人

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