- 博客(82)
- 收藏
- 关注
原创 Retrofit自己的话总结总结
Retrofit一. 概述Retrofit不是一个网络请求库,使用了较多的设计模式来 简化对网络请求的构建 和 对返回数据的处理。它的网络请求通过OkHttp实现。它巧妙地通过注解来描述一个网络HTTP请求,将一类请求方法封装为一个接口进行统一管理.使用Java动态代理的方式,动态的将这个接口的注解“翻译”成一个HTTP请求。Retrofit是基于RESTful风格推出的网络请求框架封装。(REST简单来说就是url地址中只包含名词表示资源,使用http动词表示动作进行操作。)二. 主要
2021-08-19 18:50:34
369
原创 实习周记感慨--2
本周工作kotlin的基本类型,包与导入,控制流,返回与跳转的基础知识学习。kotlin的继承,接口,扩展,泛型,枚举,委托的知识学习。kotlin的函数,lambda,内联函数的学习。kotlin前面学习过的进行梳理,学习kotlin集合和协程相关知识。学习a站代码,梳理流程,产出流程图。(”动态板块–视频“的相关知识)下周计划继续学习kotlin。学习Retrofit+Okhttp+Rxjava修改一些UI小控件思考与问题(重要)在学习kotlin后,对a站的代码能更加掌握
2021-08-19 18:48:38
207
原创 TextView 老有 padding 怎么办?
TextView 老有 padding 怎么办?在写布局时遇到的问题,有时设置了 includeFontPadding 属性为 false ,但是字体有时还是存在 padding 的情况。在网上查询之后结论是:不同 UI 会有差异性,有时会出现还存有一些 padding 这种问题。解决方法是设置 padding 为 -1,尝试后无效。布局思路没问题,但是还存有padding 导致中心不对齐,还得设置 margin 。 有什么更好的解决方法吗?答案:这个没有明确的解法,不同语言绘制有些区别,includ
2021-08-19 18:45:54
438
原创 实习周记--第一周
实习第一周 2021年04月25日本周工作下周计划:思考与问题(重要)本周工作配置办公环境,vpn,dlp,as等。配置android代码风格,熟悉gitlab。学习charles如何抓包和修改数据,学习埋点系统。并且总结抓包修改数据学习打包用法下周计划:Kotlin的基本用法思考与问题(重要)本周周三入职一共工作了4天,前两天是对于工作所需软件的下载和了解,后面对新知识kotlin开始了学习。在本周的工作中,我对新接触的知识不再是停留在知识表面,而是真正的能去运
2021-04-28 10:31:32
1204
原创 Android回顾---Activity
生命周期正常情况下的生命周期也就是Activity从正常启动到最终销毁的生命周期。onCreate():Activity正在被创建。这里可以做一些初始化工作,例如加载布局、初始化数据等。onRestart():Activity正在重新启动。当Activity从不可见变成可见时(当前Activity按Home键返回桌面或打开了一个新的Activity后又回到这个Activity时,如果它的实例还未被销毁),这个方法就会被调用。onStart():Activity正在启动。此时Activity已经可
2021-03-17 20:21:31
134
原创 Android回顾---View事件体系
说到事件分发首先得说一下MotionEvent,MotionEvent代表了手指对屏幕的一系列操作,主要包括四个事件:ACTION_DOWN:手指触摸屏幕的瞬间触发ACTION_MOVE:手指在屏幕上移动时触发ACTION_UP:手指离开屏幕时触发ACTION_CANCEL:这个是取消事件,非人为的。(如果我们把事件交给最底层的子View来消费,就会给父View(ViewGroup)设置一个不可拦截的flag,那么后续的事件父View默认都不会处理,但是不代表父View不能拦截了,如果此时父Vie
2021-03-16 23:22:09
461
1
原创 JVM回顾---DVM/ART
这部分是进阶解密中第11章的内容Dalvik虚拟机简称为DVM,它是Google专门为Android平台开发的虚拟机,它运行在Android运行时库中。但它并不是一个java虚拟机,这主要是因为DVM没有遵循JVM的规范来实现。DVM和JVM的区别基于的架构不同JVM是基于栈的,这意味着需要从栈中读写数据,这样所需的指令会更多,导致速度变慢;而DVM是基于寄存器的,它没有基于栈的虚拟机在复制数据时使用的大量出入栈指令,同时指令更紧凑和简洁。执行的字节码不同在java SE程序中,ja
2021-03-15 21:37:19
181
原创 Android回顾---动画
Android中的动画分为帧动画、View动画和属性动画三种。帧动画帧动画就是顺序播放一组预先定义好的图片,就类似于我们观看视频,一张一张的图片连续播放。在res/drawable目录下定义一个XML文件,根节点为系统提供的animation-list,然后放入定义更好的图片;使用AnimationDrawable类播放第一步定义好的Drawable中的图片,形成动画效果;View动画也称为补间动画,正如其名,它的作用对象只能是View,我们只需要拿到一个view,设定它开始和结束的位置,中
2021-03-15 21:35:24
81
原创 Android回顾---过度绘制
简述应用可能会在单个帧内多次绘制同一个像素,这种情况称为“过度绘制”。过度绘制通常是不必要的,最好避免。它会浪费 GPU 时间来渲染与用户在屏幕上所见内容无关的像素,进而导致性能问题。过度绘制检测可以使用系统自带GPU 过度绘制调试工具,在开发者选项-调试GPU过度绘制选项中开启也可以使用其他工具,例如AS的布局分析器等解决过度绘制问题使视图层次结构扁平化视图层次过多是导致过度绘制问题的主要原因之一,因此我们需要减少布局嵌套,可以提高性能。移除布局中不需要的背景默认情况下,布局没有背
2021-03-15 21:09:28
540
原创 计网回顾---HTTP缓存
根据缓存策略的不同主要可以分为两种类型:强制缓存与对比缓存强制缓存所谓强制缓存是指,请求网络数据时,如果本地存在缓存数据且缓存数据有效,则直接使用缓存数据,不必进行网络请求;否则通过网络请求获取数据。主要就是下面两个字段Expires(参考https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Expires)Expires 响应头包含日期/时间, 即在此时候之后,响应过期。例如:Expires: Wed, 21 Oct 2015 0
2021-03-15 19:54:19
117
原创 OS回顾---页表
页表是内存管理系统中的一种数据结构,用于向每个进程提供一致的虚拟地址空间,每个页表项保存的是虚拟地址到物理地址的映射,在应用程序通过虚拟地址去访问内存时,内核会借助页表和硬件把虚拟地址翻译成对应的物理地址。分页表所谓分页表,就是说一个进程只有一个根页表,不同的进程有不同的根页表。所以对于不同的进程,相同的虚拟地址可以转换到不同的物理地址上。...
2021-03-15 19:51:30
65
原创 OS回顾---用户态和内核态
是什么用户态:非特权的执行状态,只能完成一般性的操作和任务,不能对系统中的硬件和软件直接进行访问,其对内存的访问范围也局限于用户空间。内核禁止此状态下的代码进行潜在危险的操作,比如写入系统配置文件、杀掉其他用户的进程、重启系统等。内核态:是操作系统内核所运行的模式,运行在该模式的代码,可以无限制地对系统存储、外部设备进行访问。为什么为了限制用户程序的权限,保护系统安全,保证系统不被应用程序有意或无意地破坏。如果用户运行了一些恶意的程序,它们可能就会进行一些危险操作,如果不对用户程序的权限进行限
2021-03-15 19:51:20
133
原创 设计模式回顾---六大原则
记忆方法:SOLID+迪米特原则面向对象的六大原则单一职责原则(Single Responsibility Principle)——SRP单一职责原则很好理解,就是一个类尽量只做一件事。开闭原则(Open Close Principle)——OCP开闭原则的定义是软件中的对象(类,模块,函数等)应该对于扩展是开放的,但是对于修改是关闭的。即当需求发生改变的时候,我们需要对代码进行修改,这个时候我们应该尽量去扩展原来的代码,而不是去修改原来的代码,因为这样可能会引起更多的问题。里式替换
2021-03-15 19:50:18
69
原创 计网回顾---http与https区别
HTTP和HTTPS的主要区别如下:https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。(但是不一定必须是这个,这个只是默认,可以自己设置)http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。http的问题:容易被
2021-03-14 16:20:12
152
1
原创 计网回顾---HTTP2.0
多路复用很多时候我们的客户端与服务器需要进行频繁的通信,这个时候,在Http0.9也就是没有长连接之前,我们只能没通信一次建立TCP连接,通信完毕断开,这个时候会浪费大量资源,并且占用了相当长的时间。于是就引入了KeepAlive长连接这个东西,在一定时间内,同一域名多次请求数据,只建立一次TCP连接,所有的请求都复用这次的连接。那么就避免了频繁的连接和断开。但是他仍然还有两个效率上的问题:串行的文件传输:当请求a文件时,b文件只能等待,等待a文件连接到服务器、服务器处理文件、服务器返回文件这三步之
2021-03-14 16:19:27
82
原创 计网回顾---http
http是什么超文本传输协议HTTP协议被用于在客户端和服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。...
2021-03-14 16:18:39
51
原创 计网回顾---分段/分片
分段是发生在传输层,一般是TCP进行分段;分片是发生在网络层,IP层会将数据进行分片传输。分片-MTU(Maximum Transmission Unit,最大传输单元)首先说一下MTU的概念。MTU是指数据链路层会对数据帧的大小有一个限制,这个限制就叫做MTU。如果说IP层有一个数据要传,而这个数据的大小超出了MTU,那么IP层就会根据MTU将这个数据进行分片,然后一片一片的进行传输。接收方接收到这些数据片之后,就会由接收方的IP层进行重装,形成一整个数据。使用UDP很容易导致分片,而使用TCP
2021-03-14 16:17:56
1462
原创 计网回顾---三握四挥
三次握手-开始连接首先Client端发送连接请求报文,Server端接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server端发送ACK报文,并分配资源。这样就建立了TCP连接。为什么是三次而不是两次或者四次首先说一下为什么不是两次?比方说客户端发起了一个Syn包,但是这个包滞留在了网络中而迟迟没有到达,这样由于TCP的重传机制,他就会又发送一个Syn包过去,这时由于两次握手,这样就建立起了连接。这样看起来确实没问题,但是如果断开连接后,我们滞留在网络中的那个
2021-03-14 16:17:12
75
原创 计网回顾---UDP
UDP 是一个简单的传输层协议。和 TCP 相比,UDP 有下面几个显著特性:UDP 缺乏可靠性。UDP 本身不提供确认,序列号,超时重传等机制。UDP 数据报可能在网络中被复制,被重新排序。即 UDP 不保证数据报会到达其最终目的地,也不保证各个数据报的先后顺序,也不保证每个数据报只到达一次UDP 数据报是有长度的。每个 UDP 数据报都有长度,如果一个数据报正确地到达目的地,那么该数据报的长度将随数据一起传递给接收方。而 TCP 是一个字节流协议,没有任何(协议上的)记录边界。UDP 是无连接的
2021-03-14 16:15:46
110
原创 计网回顾---TCP/UDP区别
TCP UDP的区别TCP是点对点,一对一;UDP可以一对一、一对多、多对一、多对多TCP是面向连接的,UDP是面向无连接的。TCP在发送请求的时候,会去先使用三次握手进行链接,而UDP不会。TCP是提供可靠交付的,它能够保证无差错,不丢失,不重复,按序到达。UDP不提供可靠交付。TCP提供拥塞控制,而UDP没有UDP支持广播,TCP不支持TCP面向字节流,UDP面向数据报数据报大小**TCP:**由于 TCP 是建立在两端连接之上的协议,所以理论上发送的数据流不存在大小的限制。但是由于
2021-03-14 16:13:11
243
原创 计网回顾---TCP
概念TCP 提供一种面向连接的、可靠的字节流服务在一个 TCP 连接中,仅有两方进行彼此通信。TCP不能用于广播和多播TCP 使用校验和,确认和重传机制来保证可靠传输TCP 给数据分节进行排序,并使用累积确认保证数据的顺序不变和非重复TCP 使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制三次握手客户端想要建立连接,给服务器发送建立连接的包(SYN = 1, seq = x)。自己进入SYN_SEND状态服务器收到消息后,知道客户端想要建立连接,于是给客户端发送确认应
2021-03-14 16:12:32
170
原创 OS回顾---页表置换算法
最佳置换算法这是一种理想的置换算法,思想是提前判断这一页需要多少条指令后才会被访问,那么每次置换时就把需要的条数最大的先置换掉。先进先出最简单,先进先出,先进入内存的页也就会先退出。最近最久未使用也就是LRUClock置换算法页面置换算法-CLOCK置换算法及其改进版算法_totoro的博客-CSDN博客为每个页增加一个使用位,然后每新来一个页面,就把他的使用位置为1,同时还有一个指针,默认从第一位开始指起,然后当主存满了,同时此时所有的使用位都是1时,就把当前指针指向的那一位也就是第一位置
2021-03-14 16:11:24
243
原创 OS回顾---页表
页表是内存管理系统中的一种数据结构,用于向每个进程提供一致的虚拟地址空间,每个页表项保存的是虚拟地址到物理地址的映射,在应用程序通过虚拟地址去访问内存时,内核会借助页表和硬件把虚拟地址翻译成对应的物理地址。分页表所谓分页表,就是说一个进程只有一个根页表,不同的进程有不同的根页表。所以对于不同的进程,相同的虚拟地址可以转换到不同的物理地址上。...
2021-03-14 16:10:26
102
原创 OS回顾---虚拟内存,页,段
最开始的时候我一直理解的都是虚拟内存就是在硬盘中开辟的一段空间用来拓展内存,但是后来仔细了解后,才发现虚拟内存并不是这样的,这个只是运用虚拟内存技术的一个必然结果。虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。CPU会通过一个虚拟地址来访问主存,这个虚拟地址在被送到主存之前会先被MMU(内存管理单元)装换成一个物理地址。虚拟内存主要提供了如下三
2021-03-13 20:03:43
204
原创 OS回顾---进程调度
先来先服务调度算法短作业(进程)优先调度算法最短剩余时间优先算法时间片轮转法多级反馈队列调度算法(设置多个就绪队列,对应不同的优先级,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小)优先级调度算法Linux将优先级调度、时间片轮转法调度、先进先出调度综合起来应用Windows一个优先驱动的,抢先式的调度系统——具有最高优先级的可运行线程总是运行...
2021-03-13 20:02:49
68
原创 OS回顾---进程同步
进程同步是指在多道程序的环境下,存在着不同的制约关系,为了协调这种相互制约的关系,实现资源共享和进程协作,从而避免进程之间的冲突,进而引入进程同步。临界资源对于某些资源来说,在同一时间只能被一个进程所占用,这些资源就被成为临界资源。典型的临界资源比如物理上的打印机等等。对于临界资源的访问,必须是互斥的,也就是当临界资源被占用时,另一个申请临界资源的进程会被阻塞,直到其所申请的临界资源被释放。进程内访问临界资源的代码被称为临界区。进程同步指为了完成某任务而建立的两个或多个线程,这些线程需要在某些位置
2021-03-13 20:02:04
152
原创 OS回顾---进程和线程
进程是资源分配的最小单位,线程是CPU调度的最小单位。进程有自己的独立地址空间,每启动一个进程,系统就会为他分配地址空间。而线程是共享进程中的数据的,因此CPU切换一个线程比切换一个进程所需的消耗小很多,创建一个也会小很多。进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源线程间通信比进程要简单。因为同一进程下的线程共享全局变量、静态变量等数据,而进程之间必须以进程间通信方式进行。做个简单的比喻:进程=火车,线程=车厢线程在进程下行进(单纯的车厢无法运行)一个进程可.
2021-03-13 20:01:07
87
原创 OS回顾---死锁
产生的四个条件互斥访问条件:即一个资源一段时间内只能被一个线程占有,不能被两个或两个以上线程占有不可抢占条件:当一个资源正在被一个进程占用时,不可以被其他进程抢占占有且申请条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。循环等待条件:环形请求资源死锁的预防打破四个条件即可:互斥访问条件:允许进程同时占用某些资源,但是不太可能不可抢占条件:当一个进程已占有了某些资源,它又申请新的资源,但不能立即被满足时
2021-03-13 19:59:56
69
原创 OS回顾---用户态和内核态
用户态:只能受限的访问内存,且不允许访问外围设备。内核态:可以访问到所有数据,包括外围设备、用户空间和系统空间。为什么要有用户态和内核态为了限制不同程序之间的访问能力,防止他们获取到别的程序的内存数据,或者获取外围设备的数据,所以就分成了两个权限——用户态和内核态。用户态和内核态的切换系统调用一般情况下, 所有的用户程序都是运行在用户态下的,但是有些时候程序必须得做一些内核态的事情,比如从硬盘读取数据或者获取键盘输入等等,那么这些时候程序就必须通过申请使用操作系统提供的服务程序来完成工作。这时
2021-03-13 19:58:35
129
原创 OS回顾---64位和32位的区别
32位操作系统针对32位CPU设计的。64位操作系统针对64位CPU设计的。64位CPU可以运行64和32位操作系统,而32位CPU只能运行32位操作系统。32位操作系统可以一次性处理32位,也就是4个字节的数据;而64位可以一次性处理64位也就是8个字节的数据。理论上:32位=2^32B = 4 * 2^30B = 4GB,这是 32 位下单进程内存上限。64位架构下,地址线是46个,所以最大的物理地址是2^46B,折合64TB,可用地址空间也是这么大(目前为止)。...
2021-03-13 19:57:43
403
原创 JVM回顾---GC算法
GC分为四种算法:标记-清除算法复制算法标记-整理算法以及一个可以算不上算法的分代收集算法标记清除算法他就是非常简单粗暴,直接先对堆中的对象进行标记,然后判断哪些对象可以回收了,然后当GC的时候他就会直接把标记为可回收的对象直接回收。优点:算法简单缺点:会产生大量的内存碎片标记和清除的效率都不高[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jl0S4EmO-1615636137367)(https://s3-us-west-2.am
2021-03-13 19:49:31
59
原创 JVM回顾---finalize
方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。Java中所有类都从Object类中继承finalize()方法。当垃圾回收器(garbage colector)决定回收某对
2021-03-12 18:56:09
90
原创 JVM回顾---判断对象是否存活
判断对象是否存活分为两种方法:引用计数法和可达性分析法。引用计数法这种算法逻辑很简单,但是Java并不采用这种方法,因为这种方法存在致命的问题。引用计数法的逻辑是:在堆中存储对象的时候,每个对象会有个对象头,对象头中维护了一个计数器counter,每当有地方引用到了这个对象就counter++,断开引用就counter—。如果counter为0,就代表没有地方引用了,就可以被GC了。但是,如果对象A引用对象B,对象B引用对象A,然后没有任何其他的对象在引用他两了的时候,这样他两明明可以被GC,但是由
2021-03-12 18:55:27
105
原创 Java回顾---值引用和引用传递
在谈值传递和引用传递之前,我觉得应该先说一下什么是形参和实参:形参:指一个方法被调用时需要传入的参数,传入方法的参数。实参:指一个方法被调用时传入的实际值。先说一下定义吧:值传递:方法被调用时,实参通过形参将它内容的副本传入方法内部。引用传递:方法被调用时,实参将他的地址传给形参。值传递对于值传递,一般都是对于Java中基本数据类型而言的,比方说我有一个方法需要传入一个int值i ,然后里面的代码就是i=i+1,我再传入一个i进去的话,我输出这个i,传入前和传入后的值没有变化。因为他
2021-03-12 18:54:19
73
原创 Java回顾---锁
为什么非可重入锁会导致死锁public class Count{ Lock lock = new Lock(); public void print(){ lock.lock(); doAdd(); lock.unlock(); } public void doAdd(){ lock.lock(); //do something lock.unlock(); }}上
2021-03-12 18:52:51
51
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人