自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 问答 (1)
  • 收藏
  • 关注

原创 Linux IPC机制

1.管道管道是Linux由UNIX继承过来进程间的通信体制, 它是UNIX早期的一个重要通信机制。管道的主要思想的话是在内存中创建一个共享文件, 从而使通信双方利用这个共享文件来传递信息。 这个共享文件比较特殊, 它不属于文件系统只存在于内存在。 另外, 管道采用半双工的通信方式, 数据只能在一个方向上流动。2.信号信号是软件层次上对中断机制的一种模拟, 信号是一个异步通信方式, 进程不必通过任何操作来等待信号的到达。 信号可以在用户空间进程的内核之间直接交互, 内核可以利用信号来通知用户空间的进程

2021-04-16 15:00:53 160

原创 安卓之window分析

1. Window的内部机制Window是一个抽象的概念, 每一个window都对应着一个View和一个ViewRootImpl, Window和View通过ViewRootImpl来建立联系, 因此WIndow并不是实际存在的。 它是以view的形式存在。实际开发中无法直接访问Window, 对Window的访问必须通过WindowManager。window的添加过程Window的添加过程需要通过WindowManager的addView来实现, WindowManager类是一个接口,它的真正

2021-04-13 00:10:24 444

原创 LRUCache

概述LruCache是一个泛型类,它内部采用一个LinkedHashMap以强引用的方式储存外界的缓存对象,为其提供了get和put方法来完成缓存的获取和添加操作。 当缓存存满时,LruCache会移除较早使用的缓存对象, 然后再添加新的缓存对象。构造方法 /** Size of this cache in units. Not necessarily the number of elements. */ private int size; //当前缓存大小 private..

2021-03-24 23:35:32 120

原创 解决滑动冲突

假设场景是纵向滑动由父view响应,横向滑动由子view响应1. 外部拦截法点击事件都线经过父容器的拦截处理,如果父容器需要此事件的拦截就拦截,如果不需要此事件就不拦截。外部拦截法需要重写父容器的onInterceptTouchEvent方法作相应的拦截。用伪代码来展示一下public boolean onInterceptTouchEvent(MotionEvent event){ boolean intercepted = false; int x = (int

2021-03-19 23:40:18 106

原创 RecycleView浅谈

RecyclerView 简称 RV, 是作为 ListView 和 GridView 的加强版出现的,目的是在有限的屏幕之上展示大量的内容,因此 RecyclerView 的复用机制的实现是它的一个核心部分常规使用方式如下:RecycleView.setLayoutManager();RecycleView.setAdapter();RecycleView.setItemAnimator();RecycleView.addItemDecoration();setLayoutManager()

2021-03-16 19:16:17 504

原创 再聊一下JVM虚拟机栈

1. 虚拟机栈虚拟机栈是线程私有的, 与线程的生命周期同步。 在Java虚拟机规范中,对这个区域规定了两种异常状况:1.StackOverflowError:当线程请求栈深度超出虚拟机栈所允许的深度时抛出。2.OutOfMemoryError:当 Java 虚拟机动态扩展到无法申请足够内存时抛出虚拟机栈的初衷是用来描述 Java 方法执行的内存模型,每个方法被执行的时候,JVM 都会在虚拟机栈中创建一个栈帧栈帧栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构, 每个

2021-03-16 15:57:11 64

原创 计算器网络面试问题总结

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?因为Server端收到Client端的SYN请求报文后,可以直接发送SYN+ACK报文, 其中ACK报文是用来应答的。 SYN报文是用来同步的, 但是关闭连接时, 当Server端收到FIN报文时, 很可能不会立即关闭Socket,所以只能恢复一个ACK报文告诉Client, 你法的FIN报文我都收到了。 只有等到我Server端的所有报文都发送完了, 我才能发送FIN报文, 因此不能一起发送。 所以要用四次握手。【问题2】为什么TIME_W

2021-03-12 18:42:14 119

原创 Android xml 布局中 include、merge,ViewStub标签的作用

include标签include标签常用于将布局中的公共部分提取出来供其他layout共用,以实现布局模块化,也是平常我们设计布局时用的最多的一个xml布局文件有多个include标签需要设置ID,才能找到相应子View的控件,否则只能找到第一个include的layout布局,以及该布局的控件include标签如果使用layout_xx属性,会覆盖被include的xml文件根节点对应的layout_xx属性,建议在include标签调用的布局设置好宽高位置,防止不必要的buginc

2021-03-10 16:53:33 825

原创 Java中静态成员类和非静态成员类的区别

静态成员类和非静态成员类都可以访问外围类的所有成员,包括那些声明为private的成员。两者非常相似,主要静态成员类多累static修饰词。正因此,非静态成员类的每个实例都隐含着与外部类的一个实例所相关联。在非静态成员类的每个实例方法内部,可以调用外围实例上的方法,或者利用修饰过的this构造获得外围实例的引用。而静态成员类可以独立于外围实例之外。...

2021-03-10 16:41:00 580

原创 java类中的方法有4种访问级别

1. public可以被当前类,当前包,子类,不同包访问。2.protected可以被当前类,当前包,子类访问。3.default可以被当前类,当前包访问4.private只能被当前类访问。

2021-03-10 16:35:20 1076

原创 滑动

1. ScrollerScroller可以实现弹性滑动,相比scrollerTo或者scollerBy,它们两个方法是瞬间完成的,而scroller是在一定的时间范围内完成。下面来分析源码public void startScroll(int startX, int startY, int dx, int dy, int duration) { mMode = SCROLL_MODE; mFinished = false; mDuration = dur

2021-03-09 22:06:10 164

原创 ListView和RecycleView对比

1. 布局效果对比RecycleView默认就支持,线性布局,网格布局,瀑布流布局。2. API对比2.1 ListView继承重写BaseAdaoter类自定义ViewHolder和convertView一起完成复用优化工作。2.2 RecycleView继承重写RecycleView.Adapater和RecycleView.ViewHolder设置布局管理器,控制布局效果package com.sihan.chatroomdemo;import android.view.Layo

2021-03-09 17:29:43 297

原创 线程中断

1. 中断1.1 概述当线程的run方法执行完毕,或者在方法中出现没有捕获的异常时, 线程将终止。 interrupt方法可以用来请求中断线程, 当一个线程调用interrupt方法时, 线程的中断标识将被标记为true, 线程会不时检测这个中断未, 以判断线程是否应该被中断。while(!Thread.currentThread().isInterrupter()){ doSomethingHere();}还可以调用Thread.interrupted()来对中断标识为进行复位。 但是如果一

2021-03-09 00:05:49 74

原创 Http,Https

1. 什么是HTTP超文本传输协议,是一个基于请求与相应,无状态的,应用层的协议, 常基于TCP/IP协议传输数据, 互联网上应用最广泛的一种网络协议, 所以的www文件都必须遵循这个标准。 设计HTTP的初衷是为了提供一种发布和接受HTML页面的方法。历史:版本产生时间内容发展现状HTTP/0.91991年不涉及数据包传输,规定客户端和服务器之间的通信格式,只能get请求没有正式作为标准HTTP/1.01996年传输内容格式不限制,增加PUT,PATCH,HE

2021-03-07 15:54:04 257

原创 为什么需要三次握手 四次挥手 以及http和tcp

什么连接的时候是三次握手正如上文所描述的,为了实现可靠传输,发送方和接收方始终需要同步( SYNchronize )序号。 需要注意的是, 序号并不是从 0 开始的, 而是由发送方随机选择的初始序列号 ( Initial Sequence Number, ISN )开始 。 由于 TCP 是一个双向通信协议, 通信双方都有能力发送信息, 并接收响应。 因此, 通信双方都需要随机产生一个初始的序列号, 并且把这个起始值告诉对方。————————————————关闭的时候却是四次握手?因为当Server

2021-03-06 21:30:13 152

原创 线程池

1. 概述优点:重用线程池中的线程, 避免因为线程的创建和销毁锁带来的性能开销。有效控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象。能够对线程进行简单的管理, 并提供定时执行以及指定间隔循环等执行功能。2. ThreadPoolExecutorThreadPoolExecutor是线程池的真正实现,它的构造方法提供了一系列参数来配置线程池, 下面介绍ThreadPoolExecutor的构造方法中的各个餐厨的含义, 这些参数将会直接影响线程池的功能特性。Cor

2021-03-04 15:20:37 95 1

原创 volatile关键字

1. volatile是什么?volatile是java虚拟机提供的一种轻量级同步机制。2. volatile三个特征保证可见性不保证原子性禁止指令重排3. 如何保证可见性java内存模型规定:线程解锁前,必须把共享变量的值刷新回主内存。线程加锁前,必须读取主内存的最新值到自己的工作内存。加解锁是同一把锁。因为JVM工作的实体是线程, jvm会为每个线程分配一片工作内存,工作内存是每个线程的私有的数据区域,而java内存模型规定所有变量都存储在主内存,主内存是共享的内存区域。所有线

2021-02-28 00:19:33 98 1

原创 Binder

1.概述Binder是安卓中的一个类, 它实现了IBinder接口。 它是安卓中一种跨进城的通信方式, Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder。从Framework角度来说Binder是ServiceManager连接各种Manager(ActivityManager, WindowManager)和相应的ManagerService的桥梁。从安卓应用层来说, Binder是客户端和服务端进行通行的媒介, 当bindService的时候,服务端会返回了一个包含了服

2021-02-25 23:23:39 141

原创 序列化

1. SerializableSerializable是java所题哦那个的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。通过Serializable方式来实现对象的序列化,实现起来非常简单,几乎所有工作都被系统自己完成了。只需要采用ObjectOutputSream和ObjectInoytStream即可轻松实现。serialVersionUIDSerializable即时不指定serialVersionUID也可以实现序列化, 那到底要不要指定呢?如果指定的话seria

2021-02-25 22:50:49 67

转载 synchronized关键字

1. synchronized的三种应用方式Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁静态同步方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁同步方法块,锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。①多个线程访问同一个对象的同一个方法public class SynchronizedTest implements Runnable

2021-02-25 13:26:50 84

原创 JVM虚拟机内存

1 Java内存区域与内存溢出异常1.1运行时数据区域根据java虚拟机规范,Java的虚拟机啊锁需要的内存将会包括以下几个运行时数据区域。1.1.1 程序计数器程序计数器是一块较小的内存空间,线程私有。 字节码解释器工作就是通过改变这个计数器的值来选取吓一跳需要执行的字节码指令, 它是程序控制流的指示器,分支,循环,跳转,异常处理,线程恢复等基础功能。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址, 如果正在执行的是Native方法,这个计数器的值则为

2021-02-24 23:35:36 130

原创 Activity的四种启动模式

1. standard标准模式,即如果不在mainfest文件中配置模式,activirt默认以标准模式启动。在该模式下,activity会以启动顺序依次压入栈中,同时每次启动Activity都会创建一个新的Activity实例比如Activity的启动顺序是ABCDA那么此时栈内情况也是ABCDA。2.singleTop栈顶复用模式。即如果我们要启动的Activity在栈顶,那么就会复用这个Activity实例。比如我们现在的栈内状况是ABCD 那么此时我们想启动Activity D 那么如果D

2021-02-24 15:41:55 288

原创 Activity的启动流程 基于11

我们从Activity的 startActivity方法开始分析,它由好多重载方式,但是进行追踪我们可以发现,它都会调用startActivityForResult方法,它的实现如下所示:public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) { if (mParent == null) {

2021-02-21 15:33:03 261

原创 View的事件分发机制

1. 点击事件的传递规则所谓点击事件的事件分发,其实就是对MotionEvent事件的分发过程,就是一个MotionEvent产生了以后,系统需要把这个事情传递给一个具体的view,而这个传递的过程就是分发过程。 由下面三个方法来共同完成1.1 public boolean dispatchTouchEvent(MotionEvent ev)这个方法用来进行事件的分发。 如果事件能够传递给当前View, 那么此方法一定会被调用, 返回结果受当前View的onTouchEvent和下级View的disp

2021-02-20 16:33:41 212

原创 手写一个安卓图片框架

ImageLoader的实现一般来说一个好的图片库应该具备如下功能图片的同步加载;图片的异步加载;图片压缩;内存缓存;磁盘缓存;网络拉取;1.图片压缩功能的实现public class ImageReSizer { public Bitmap decodeSampleBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight){ //首先用inJustDecodeBounds =

2021-02-20 01:53:20 317

原创 自定义View例子

首先我们先来实现一个很简单的圆形自定义View1.继承View并且重写onDraw方法import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;import androidx.annotati

2021-02-19 21:59:43 272

原创 安卓Jetpack之Navigation

源码分析**1. NavHostFragment**NavHostFragment作为一个容器,所有的导航操作都是在NavHostFragment中进行。1.1 onAttach() @CallSuper @Override public void onAttach(@NonNull Context context) { super.onAttach(context); if (mDefaultNavHost) { g

2021-01-30 14:58:02 234

原创 安卓application和activity启动流程

安卓application启动流程源码分析ActivityThread初始化:public static void main(String[] args) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain"); // Install selective syscall interception AndroidOs.install(); /

2021-01-20 15:16:47 1420

原创 Android面试

Android面试##一、Android1. ActivityQ:说下Activity的生命周期?(1)onCreate:create表示创建,这是Activity生命周期的第一个方法,也是我们在android开发中接触的最多的生命周期方法。它本身的作用是进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。(2)onStart:start表示启动,这是Activity生命周期的第二个方法。此时Activity已经可见了,但是还没出现在前

2020-12-30 14:14:11 346

转载 wait()和sleep()的区别

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。每个对象都有一个机锁来控制

2020-12-14 22:54:17 99

原创 观察者模式

一、什么是观察者模式观察者一般可以看做是第三者,比如在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了。再比如,拍卖会的时候,大家相互叫价,拍卖师会观察最高标价,然后通知给其它竞价者竞价,这就是一个观察者模式。对于观察者模式而言,肯定有观察者和被观察者之分。比如在一个目录下建立一个文件,这时系统会通知目录管理器增加目录,并通知磁盘减少空间,在这里,文件就是观察者,目录管理器和磁盘就是被观察者。观察者模式(Observer

2020-12-14 22:34:36 87

原创 工厂模式

一、简单工厂模式例子:抽象一个米饭的基类,这是抽象的产品类public abstract class IRice { public void desc(){ }}再来一份白米饭的具体产品类public class SteamRice extends IRice { @Override public void desc() { System.out.println("白米饭好香好软哦!"); }}程序员加班快餐应付

2020-12-14 20:54:25 93

原创 访问一个网站的过程

整个过程可以解析为几个部分1.域名解析成IP地址;2.与目的主机进行TCP连接(三次握手)建立连接3.发送与收取数据(浏览器与目的主机开始HTTP访问过程)4.与目的主机断开TCP连接(四次挥手);HTTP协议HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终

2020-12-14 20:10:52 418

原创 单例模式

饿汉模式:对象没有使用之前就去初始化对象,但是这种方法会带来内存浪费。public class SingleExample{private static SingleExample singleExample = new SingleExample();public static SingleExample getSingleExample(){ return singleExample;}}针对这种情况,我们可以对以上的代码进行改进,使用一种新的设计思想——延迟加载(Lazy-load

2020-12-14 19:33:46 51

原创 java之线程池

**一、Java API中的ThreadPoolExecutor类**java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。下面我们来看一下ThreadPoolExecutor类的具体实现源码。1.1、构造方法从上面的代码可以得知,ThreadPoolExecutor继承了AbstractExecutorService类,并提供了四个构造器,事实上,通过观察每个构造器的源码具体实现,发

2020-12-06 21:01:56 63

转载 Java多线程

一、进程与线程概述1.1 进程和线程的定义进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组计数器,和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。1.2 进程和线程的关系。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。相对

2020-12-06 17:14:46 57

原创 从源码分析ArrayList

结构public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable1. 两个重要的成员变量 /** * The array buffer into which the elements of the ArrayList are stored. * The capacity

2020-12-05 17:04:09 47

原创 IOC,AOP

IOCIOC,也就是控制反转。 比如: A对象里面依赖了一个B对象,也就是我们通常说的在A对象里面实现这个B对象, 也就说说B对象是由A对象控制的。 IOC的意思就是说,将B对象的控制权交给第三方来控制,也就是IOC容器...

2020-12-05 15:49:56 153

原创 安卓之Fragment

一:什么是Fragment如字面意思,Fragment是碎片,片段。其目的是解决不同屏幕分辨率的动态和灵活ui设计。大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了fragments。fragment在活动activity中为不同屏幕的尺寸修改布局设置(小屏幕可能只显示一个fragment,大屏幕会显示几个fragment)Fragments必须写成可重用的模块,因为fragment有自己的layout,自己进行时间响

2020-11-29 16:57:22 321 1

原创 TCP/IP 协议

1. 传输层有哪些协议及对应职能?1、传输控制协议TCPTCP协议:面向连bai接的可靠传输协议。利用TCP进行通信时,首先要通过三步握手,以建立通信双方的连接。TCP提供了数据的确认和数据重传的机制,保证发送的数据一定能到达通信的对方。像手机打电话一样,还要保证接收方接通电话才能传输数据。2、用户数据报协议UDPUDP协议:是无连接的,不可靠的传输协议。采用UDP进行通信时不用建立连接,可以直接向一个IP地址发送数据,但是不能保证对方是否能收到。UDP就像发短信,只管发送出去,不关心对方是否收

2020-11-29 01:13:25 609

空空如也

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

TA关注的人

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