自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 Android Studio Find in Files 中,In Project 、 Module、Diretory、Scope有什么区别

使用 Scope 的作用是,在搜索时只会查找某些指定的文件或目录,而根据在选择的 Scope 是否与搜索的文本相关,可以加快搜索速度。总的来说,在项目中进行全局搜索使用“In Project”选项,需要查找当前模块中的特定内容使用“In Module”选项,需要精确定位检索内容所在目录时使用“In Directory”选项,需要自定义搜索范围时使用“Scope”选项。In Directory:这个选项会在指定的目录中搜索指定的文本或代码片段。Scope:在自定义的搜索范围中搜索。

2023-04-25 17:20:51 759

原创 react-redux的理解

React-Redux结合了React和Redux的强大功能,使得开发人员可以更加方便地使用Redux来管理他们的React应用程序的状态。它提供了一些工具和API,使得React组件可以访问Redux store中的状态,并且可以将Redux actions分发给store以更新状态。它提供了一种可预测的状态管理方案,使得开发人员可以轻松地将应用程序的状态从任何组件中抽离出来并存储在一个全局的store对象中。React-Redux是一个用于在React应用程序中管理状态的库。

2023-04-24 00:09:51 306

原创 图解Android图片三级缓存

在Android开发中,如果图片过多,而我们又没有对图片进行有效的缓存,就很容易导致OOM(Out Of Memory)错误。因此,图片的缓存是非常重要的,尤其是对图片非常多的应用。现在很多框架都做了很好的图片缓存处理,如Fresco、Glide等。内存缓存,读取速度最快。硬盘缓存(文件缓存),读取速度比内存缓存稍慢。网络缓存,读取速度最慢。其中内存缓存和硬盘缓存对应的类分别是LruCache和DiskLruCache。Android在Android 3.1加入了LruCache缓存类,其中维护着

2021-06-23 10:16:08 204

原创 快排、前k小、第k大等题目的通用解法

###快排首先快排的写法大家都会,基本上重点在partition函数的编写,我一般使用的partititon模版如下,大家可以参考:public int partition(int[] nums,int left,int right){ int pivot = nums[left]; while(left < right){ while (left < right && nums[right] >= pivot){

2021-05-31 15:16:05 146

原创 MeasureSpec和LayoutParams的对应关系

系统内部是通过MeasureSpec来进行View的测量,但是正常情况下我们使用View指定MeasureSpec,尽管如此,但是我们可以给View设置LayoutParams。在View测量的时候,系统会将LayoutParams在父容器的约束下转换成对应的MeasureSpec,然后再根据这个MeasureSpec来确定View测量后的宽/高。需要注意的是,MeasureSpec不是唯一由LayoutParams决定的,LayoutParams需要和父容器一起才能决定View的MeasureSpec,从

2020-09-10 10:35:43 454

原创 View的工作原理---深入理解MeasureSpec

为了更好理解View的测量过程,我们还需要理解MeasureSpec,从名字上来看,MeasureSpec看起来像“测量规格”或者“测量说明书”,不管怎么翻译,它看起来都好像是或多或少地决定了View的测量过程。通过源码可以发现,MeasureSpec的确参与了View的measure过程。MeasureSpec是干什么的呢?它在很大程度上决定了一个View的尺寸规格,之所以是很大程度上是因为这个过程还受父容器的影响,因为父容器影响View的MeasureSpec的创建过程。在测量过程中,系统会将View的

2020-09-01 16:31:17 165

原创 View的工作原理---ViewRoot和DecorView基本概念

ViewRoot对应于ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成的。在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联,这个过程可参看如下源码:root = new ViewRootImpl(view.getContext(),display);r

2020-08-24 14:43:09 466

原创 View的滑动冲突---滑动冲突的解决方式

首先我们要分析第一种滑动冲突场景,这也是最简单、最典型的一种滑动冲突,因为它的滑动比较简单,不管多复杂的滑动冲突,它们之间的区别仅仅是滑动规则不同而已。抛开规则不说,我们需要找到一种不依赖具体的滑动规则的通用的解决方法,在这里,我们就根据场景1的情况来得出通用的解决方法,然后场景2和场景3我们只需要修改有关滑动规则的逻辑即可。之前说过,针对场景1中的滑动,我们可以根据滑动的距离差来判断,这个距离差就是所谓的滑动规则。如果用ViewPager去实现场景1中的效果,我们不需要手动处理滑动冲突,因为ViewP.

2020-08-17 09:48:45 313

原创 View的滑动冲突---滑动冲突的处理规则

对于场景1,它的处理规则是,当用户左右滑动时,需要让外部的View拦截点击事件,当用户上下滑动时,需要让内部View拦截点击事件。这个时候我们就可以根据它们的特征来解决冲突,具体来说是,根据滑动是水平滑动还是竖直滑动来判断到底由谁来拦截事件,如下图所示:根据滑动中两个点之间的坐标就可以得出到底是水平滑动还是竖直滑动。如何根据坐标来得到滑动的方向呢?这个很简单,由很多可以参考,比如可以根据滑动路径和水平方向所形成的夹角,也可以依据水平方向和竖直方向上的距离差来判断,某些特殊时候还可以依据水平和竖直方向的.

2020-08-03 15:42:08 201

原创 View的滑动冲突---常见的滑动冲突场景

常见的滑动冲突场景可以简单分为如下三种:场景1 - 外部滑动方向和内部滑动方向不一致场景2 - 外部滑动方向和内部滑动方向一致场景3 - 上面两张情况的嵌套先说场景1,主要是将ViewPager和Fragment配合使用所组成的页面滑动效果,主流应用几乎都会使用这个效果。在这种效果中,可以通过左右滑动来切换页面,而每个页面内部往往又是一个ListView。本来这种情况下是有滑动冲突的,但ViewPager内部处理了这种滑动冲突,因此使用ViewPager时我们无须关注这个问题,如果我们采取的不是V

2020-08-02 13:38:46 208

原创 View的事件分发机制---事件分发机制的源码分析

1.Activity对点击事件的分发过程点击事件用MotionEvent来表示,当一个点击操作发生时,事件最先传递给当前Activity,由Activity的dispatchTouchEvent来进行事件派发,具体的工作是由Activity内部的Window来完成的。Window会将事件传递给decor view,decor view一般就是当前界面的底层容器(即setContentView所设置的View的父容器),通过Activity.getWindow.getDecorView()可以获得。我们先

2020-07-31 15:29:00 91

原创 View的事件分发机制---点击事件的传递机制

在介绍点击事件的传递机制之前,首先我们要明白这里要分析的对象就是MotionEvent,即点击事件,所谓点击事件的事件分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,而这个传递的过程就是分发过程,点击事件的分发过程由三个很重要的方法来共同完成:dispatchTouchEvent onInterceptTouchEvent 和 onTouchEvent,下面我们先介绍这几个方法: **public boo

2020-07-28 15:38:13 218

原创 弹性滑动---使用延时策略

延时策略的核心思想是通过发送一系列延时消息从而达到一种渐进式的效果,具体来说可以使用Handler或View的postDelayed方法,也可以使用线程的sleep方法,对于postDelayed方法来说,我们可以通过它来延时发送一个消息,然后在消息中来进行View的滑动,如果接连不断地发送这种延时消息,那么就可以实现弹性滑动的效果,对于sleep方法来说,通过在while循环中不断地滑动View和Sleep,就可以实现弹性滑动的效果。 下面采用Handler来做个示例,其他方法请你自行去尝试,思想都是类

2020-07-28 11:01:48 104

原创 弹性滑动---通过动画

动画本身就是一种渐进的过程,因此通过它来实现的滑动天然具有弹性效果,比如以下代码可以让一个View的内容在100ms内向左移动100像素ObjectAnimator.ofFloat(targetView,"translationX",0,100).setDuration(100).start();不过这里想说的不是这个问题,我们可以利用动画的特性来实现一些动画不能实现的效果。还拿scroll来说,我们也想模仿Scroller来实现View的弹性滑动,那么利用动画的特性,我们可以采用如下方式来实现fi

2020-07-28 10:43:36 171

原创 弹性滑动---使用Scroller

Scroller scroller = new Scroller(mContext);//缓慢滚动到指定位置private void smoothScrollTo(int destX,int destY){ int scrollX = getScrollX(); int deltaX = destX - scrollX; //1000ms内滑向destX,效果就是慢慢滑动 mScroller.startScroll(scrollX,0,destX,0,1000);

2020-07-28 10:13:34 279

原创 View的滑动---改变布局参数

第三种实现View滑动的方法,就是改变布局参数,即改变LayoutParams。这个比较好理解了,比如我们想把一个Button向右平移100px,我们只需要将这个Button的LayoutParams里的marginLeft参数的值增加到100px即可,是不是很简单呢?还有一种情形,为了达到移动Button的目的,我们可以再Button左边放置一个空的View,这个空View的默认宽度为0,当我们需要向右移动Button时,只需要重新设置空View的宽度即可,当空View的宽度增大时(假设Button的父容

2020-07-27 20:00:22 255

原创 View的滑动---使用动画

使用动画来移动View,主要是操作View的translationX和translationY属性,即可采用传统的View动画,也可以采用属性动画。采用View动画的代码,如下所示。次动画可以再100ms内将一个View从原始位置向右下角移动100个像素<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"android:fillAft

2020-07-27 08:25:53 204

原创 View的滑动---使用scrollTo/scrollBy

1. 使用scrollTo/scrollBy为了实现View的滑动,View提供了专门的方法来实现这个功能,那就是scrollTo和scrollBy,先看看这两个方法的实现:public void scrollTo(int x,int y){ if(mScrollX != x || mScrollY != y){ int oldX = mScrollX; int oldY = mScrollY; mScrollX = x; mScr

2020-07-24 15:42:15 307

原创 View基础知识---VelocityTracker、GestureDetector和Scroller

1.VelocityTracker速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。它的使用过程很简单,首先,在View的onTouchEvent方法中追踪当前单击事件的速度VelocityTracker velocityTracker = VelocityTracker .obtain();velocityTracker.addMovement(event);接着,当我们知道当前的滑动速度时,这个时候可以采用如下方式来获得当前的速度velocityTracker.comput

2020-07-24 15:18:52 196

原创 Android-----Gson学习

一、什么是Gson?Gson是一个Java库,可用于将Java对象转换为其JSON表示形式。 它还可以用于将JSON字符串转换为等效的Java对象。 Gson可以处理任意Java对象,包括您没有源代码的现有对象。有一些开源项目可以将Java对象转换为JSON。 但是,大多数方法都要求您在类中放置Java批注。 如果您无法访问源代码,则无法执行某些操作。 大多数还不完全支持Java泛型的使用。 Gson认为这两个都是非常重要的设计目标。二、为什么要使用Gson?提供简单的toJson()和fromJs

2020-07-24 10:43:35 138

原创 View基础知识---MotionEvent和TouchSlop

1.MotionEvent在手指接触屏幕后所产生的一系列事件中,典型的事件类型有如下几种ACTION_DOWN——手指刚接触屏幕ACTION_MOVE——手指在屏幕上移动ACTION_UP——手指从屏幕上松开的一瞬间正常情况下,一次手指触摸屏幕的行为会触发一系列点击事件,考虑如下几种情况:点击屏幕后离开松开,事件序列为DOWN -> UP;点击屏幕滑动一会再松开,事件序列为DOWN -> MOVE -> … ->MOVE ->UP上述三种情况是典型的事件序列,

2020-07-23 08:16:36 292

原创 View的基础知识---View的位置参数

View的位置主要由它的四个顶点来决定,分别对应于View的四个属性:top、left、right、bottom,其中top是左上角纵坐标,left是左上角横坐标,right是右下角横坐标,bottom是右下角纵坐标,View的坐标和父容器的关系如图:很容易得出View的宽高和坐标的关系width = right - leftheight = bottom - top如何得到View的这四个属性呢?在View的源码中它们对应于mLeft、mRigh、mTop和mBottom这四个成员变量,获取方

2020-07-22 19:15:19 671

原创 JVM学习之路---Class类文件结构

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储额内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表。无符号数属于基本的数据类型,以u1,u2,u4,u8来分别代表.

2020-07-15 16:25:35 87

原创 JVM学习之路---内存分配与回收策略

Java中的自动内存管理最终可归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象内存,之前我们以及介绍了虚拟机中垃圾收集器体系及其运作原理,现在探讨一下给对象分配内存的部分。对象的内存分配,往大方向上讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,分配的规则不是固定的,取决于当前使用的是那种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。1.对象优先在Eden分配大多数情况下,对象在

2020-06-12 19:58:08 95

原创 3.Android中的IPC方式---使用AIDL(2)

我们接着再调用一下另外一个接口addBook,我们在客户端给服务器添加一本书,然后再获取一次,看程序是否能够正常工作。还是上次的代码,客户端在服务连接后,在onServiceConnected中做如下改动public void onServiceConnected(ComponentName name, IBinder service) { IBookManager bookManager = IBookManager.Stub.asInterface(service);

2020-06-10 22:02:25 111

原创 JVM学习之路---垃圾收集器

如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现没有任何规定,因此不同厂商、版本的虚拟机的垃圾收集器可能会有很大差别。本文主要讨论的收集器基于Sun HotSpot虚拟机1.6版Update22,这个虚拟机包含的所有收集器如下:在介绍这些收集器各自特性之前,明确一个观点:虽然我们是对各个收集器进行比较,但并非为了挑选一个最好的收集器出来,没有万能的收集器,我们选择的是对具体应用的最适合的收集器。1.Serial收集器历史最悠久的虚拟机,

2020-06-09 00:14:43 84

原创 3.Android中的IPC方式---使用AIDL(1)

Messenger是以串行的方式来处理客户端发来的消息,如果大量的消息同时发送到服务端,服务端任然只能一个个处理,如果有大量的并发请求,那么用Messenger就太不合适了。同时,Messenger的作用主要是为了传递消息,很多时候我们可能需要跨进程调用服务端的方法,这种情形用Messenger就无法做到了,但是我们可以使用AIDL来实现跨进程的方法调用。AIDL也是Messenger的底层实现,因此Messenger本质上也是AIDL,只不过系统为我们做了封装从而方便上层的调用,在Binder的基础上可以

2020-06-08 21:16:13 119

原创 JVM学习之路---垃圾收集算法

1.标记 - 清除算法最基础的收集算法是“标记 - 清除”算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思想并对其缺点进行改进得到的。它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃

2020-06-07 17:42:26 135

原创 3.Android中的IPC方式---使用Messenger

Messenger可以翻译为信使,顾名思义,通过它可以在不同进程中传递Message对象,在Message中放入我们需要传递的数据,就可以轻松地实现数据的进程间传递了。Messenger是一种轻量级的IPC方案,它的底层是AIDL。下面是Messenger的两个构造方法,从构造方法的实现上我们可以明显看出AIDL的痕迹,不管是IMessenger还是Stub.asInterface,这种使用方法都表明它的底层是AIDL。public Messenger(Handler target){ mTarg

2020-06-07 16:26:35 144

原创 JVM学习之路---引用

在JDK 1.2之前,Java中的引用的定义很传统:如果reference类型中存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用。这种定义很纯粹,但是太过狭隘,一个对象在这种定义下只有被引用或没有被引用两种状态,对于如何描述一些“食之无味,弃之可惜”的对象就显得无能为力。我们希望能描述这样一类对象:当内存空间还足够时,则能保留在内存之中;如果内存在进行垃圾收集后还是非常紧张,则可以抛弃这些对象。很多系统的缓存功能都符合这样的应用场景。在JDK 1.2之后,Java对引用的概念进行了扩充,将

2020-06-06 22:51:09 63

原创 JVM学习之路---垃圾收集器算法(根搜索算法)

这个算法的基本思路就是通过一系列的名为“GC Roots”的对象作为起点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(图论中是从GC Roots到这个对象不可达)时,证明此对象时不可用的。如图:对象objct5,object6,object7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会判定为是可回收的对象。在Java中,可作为GC Roots的对象包括以下几种虚拟机栈(栈帧中的本地变量表)中引用的对象方法区中的类静态属性

2020-06-06 21:18:42 251

原创 3.Android中的IPC方式---使用文件共享

共享文件也是一种不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据,比如A进程把数据写入文件,B进程通过读取这个文件来获取数据。我们知道,在Windows上,一个文件如果被加了排斥锁将会导致其他线程无法对其进行访问,包括读和写,由于Android系统基于Linux,使得其并发读/写可以没有限制地进行,甚至两个线程同时对同一个文件进行写操作都是允许的。通过文件交换数据很好使用,除了可以交换一些文本信息外,我们还可以序列化一个对象到文件系统中的同时从另一个进程中恢复这个对象,下面就展示这种使用方法。

2020-06-06 20:22:19 151

原创 JVM学习之路---垃圾收集器算法(引用计数法)

很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器都为0的对象就是不可能再被使用的。客观地说,引用计数算法的实现简单,判定效率也很高,大部分情况下它都是一个不错的算法,但是,Java语言中没有选用引用技术算法来管理内存,其中主要的原因是它很难解决对象之间的相互循环引用的问题。举个例子,对象objA和对象objB都有字段instance,赋值令objA.instance = objB及objB.inst

2020-06-05 18:22:39 127

原创 3.Android中的IPC方式---使用Bundle

我们知道,四大组件中的三大组件(Activity、Service、Receiver)都是支持在Intent中传递Bundle数据的。由于Bundle实现了Parcelable接口,所以它可以方便地在不同的进程间传输。基于这一点,当我们在一个进程中启动了另一个进程的Activity、Service、Receiver,我们就可以在Bundle中附加我们需要传输给远程进程的信息并通过Intent发送出去。当然,我们传输的数据必须能够被序列化,,比如基本类型、实现了Parcellable接口的对象、实现了Seria

2020-06-05 18:00:48 97

原创 2.IPC基础概念---Binder

直观来说,Binder是Android中的一个类,它实现了IBinder接口。从IPC角度来说,Binder是Android中的一种跨进程通信方式Binder还可以理解为一种虚拟的物理设备,它的驱动是/dev/binder,该通信方式在Linux中没有;从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager、WindowsManager,等等)和相应ManagerService的桥梁;从Android应用层来说,B

2020-06-04 17:16:17 140

原创 JVM学习之路---OutOfMemoryError(OOM)异常

在Java虚拟机的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OOM异常的可能。Java堆溢出Java堆用于储存对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,就会在对象数量达到最大堆的容量限制后产生内存溢出异常。Java堆内存的OOM异常是实际应用中最常见的内存溢出异常情况。出现Java堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError”会跟着进一步提示“Java heao space”。要

2020-06-04 14:04:44 215

原创 JVM学习之路-----对象访问

在Java语言中,对象访问是如何进行的?如下面这句代码:Object obj = new Object()假设这句代码出现在方法体中,那么“Object obj”这部分语义会将反映到Java栈的本地变量表中,作为一个reference类型数据出现。而"new Object()"这部分的语义将会反映到Java堆中,形成一块存储了Object类型所有实例数据值的结构化内存,根据具体类型以及虚拟机实现的对象内存布局的不同,这块内存长度是不固定的。另外,在Java堆中还必须包含能查找到此对象类型数据(如对象类

2020-06-02 16:31:51 99

原创 2.IPC基础概念---Parcelable接口

Parcelable也是一个接口,只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递。下面的示例是一个典型的用法:public class User implements Parcelable{ public int userId; public String userName; public boolean isMale; public Book book; public User(int userId,String userN

2020-06-02 15:42:02 166

原创 JVM学习之路-----Java内存区域

1 运行时数据区域java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁,java虚拟机所管理的内存将会包括以下几个运行时数据区域:1.1 程序计数器程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器 。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分

2020-05-31 23:36:41 126

原创 2.IPC基础概念------Serializable接口

IPC基础概念主要包含三方面内容:Serializable接口、Parcelable接口以及Binder,Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时需要使用Serializable或者Parcelable。还有我们需要把对象持久化到存储设备上或者通过网络传输给其他客户端,也需要Serializable来完成对象的持久化,下面先介绍如何使用Serializable来完成对象的序列化。2.1 Serializable接口Se

2020-05-31 11:46:48 292

空空如也

空空如也

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

TA关注的人

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