自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(167)
  • 资源 (2)

原创 常见平衡树(2-3树与红黑树原理与实现)

原文地址:https://kswapd.cn/article/twothreetree-and-rbtree/本文介绍下两种常见的平衡树,2-3树和红黑树,这两种树在工业级代码中有广泛的应用。其中红黑树可以看成是2-3树的进化版本,理解2-3树后,对理解红黑树的平衡过程很有帮助,所以建议大家按照顺序阅读。2-3树计算机科学中,2–3树是一种树型数据结构,内部节点(存在子节点的节点)...

2019-07-08 23:29:32 230

原创 [Android] 智能指针sp与wp

智能指针sp与wp在AOSP中,Google实现了一套特有的智能指针系统,用来方便C++工程中的内存管理。内存释放是C++工程中非常难处理的一部分,为此一些C++工程都会有自己的智能指针系统,C++11的std中也提供了auto_ptr之类的智能指针的概念。从auto_ptr说起我们先看下C++ 11中的auto_ptr,这个比AOSP中的较容易理解。auto_ptr在memory.h中,...

2019-03-13 17:18:52 478 3

原创 okHttp源码分析

整体设计OkHttp设计较为复杂,但是层次还算清晰,我把主要的类关系画了个图,大概是这样。OkHttp的类较多,这里只描述下重要的类关系,可以看出OkHttp的主要功能都集中在Interceptor中,通过Interceptor完成构建请求,建立Socket连接,建立SSLSocket连接,证书校验等步骤。我们看下Interceptor的调用过程:在这个拦截器设计中,我们可以对Requ...

2019-02-23 17:26:21 159

原创 [Android] AOSP 开发并刷入Pixel

首先下载AOSP代码,这个可以参考以前的文章https://blog.csdn.net/y874961524/article/details/80725389上篇文章介绍了编译后启动模拟器,模拟器不需要驱动,所以比较容易,但是运行缓慢,下面我们学习将aosp编译到真机。这一步假设我们已经成功下载了AOSP代码,但是因为需要刷入真机,所以还需要下载驱动,重新编译等步骤。repo 使用AOS...

2019-02-09 15:00:31 2804

原创 [Android] GIF播放优化

背景:针对APP中大量的GIF播放场景进行优化,指标以内存占用,流畅性为主。目前Anroid上比较流行的GIF播放方案有Glide和android-gif-drawable,下面我们逐一进行分析,以及如何对现有方案进行优化。android-gif-drawable基本使用链接:https://github.com/koral--/android-gif-drawable这个是比较流行...

2019-01-22 16:17:37 1469 1

原创 [Android] Glide核心逻辑解析

Glide核心逻辑解析分三个模块进行,分别是Registry(注册器), Engine(请求),Cache(缓存)。Registry模块Registry的职责是注册Glide的所有组件,是Glide扩展的基石,目前在Registry中注册的组件有ModelLoaderFactory,ResourceDecoder, DataRewinder, Encoder。我们看下个组件职责:Mod...

2018-11-08 09:52:46 321

原创 [Java] volatile的使用场景

volatile的使用场景volatile用处volatile是java中较轻量的同步原语,用volatile声明的变量保证了该变量的可见性, 使用volatile声明的变量被其他线程更改时,该变量会立即被写入内存,同时 CPU会锁住总线,将缓存同步指令传递到其他处理器,其他处理器会从主内存中获取该变量的最新值更新到自己的缓存中。如下面的代码,如果这个counter变量没有声明成volat...

2018-10-03 23:27:51 2908 1

原创 [Android] 记一次FileDescriptor泄漏造成的Crash

记一次FileDescriptor泄漏造成的Crash问题描述最近项目中一直偶现Native Crash,先看下log。09-29 10:46:47.530 24328-24328/? A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 24328 (com.bw.pk) 09-29 10:46:47.533 448-448/? I/MIUIN...

2018-09-30 13:05:20 2557

原创 [Android] ConstaintLayout性能分析

Android ConstaintLayout性能分析最近项目上大规模使用了ConstrainLayout,于是对性能进行一定的分析, 以及介绍一些使用心得。性能分析与RelativeLayout对比,基于HierarchyViewer之前网上也有部分关于ConstrainLayout性能分析的文章,大部分是基于HierarchyViewer的,下面是分析的结果。使用Constrai...

2018-09-24 14:11:55 497

原创 [Android] 使用Gradle Plugin实现自动化屏幕适配

屏幕适配的必要性处理虚拟尺寸和设计稿之间的比例,如设计稿为375 x 667,我们需要将这个尺寸缩放到我们的虚拟尺寸上。处理个别手机虚拟尺寸不同的问题,让虚拟尺寸不同的手机显示相同的视觉效果。何为虚拟尺寸我们采用Android中的dp来作为单位来描述虚拟尺寸。下面先来解释下dp。概念解释我们需要先看下下面的几个定义:像素(PX): 屏幕上的物理点,是显示图像...

2018-09-02 18:55:38 367

原创 Gradle Plugin实现检测Android项目运行时依赖

背景在Android开发过程中,我们会引入很多的第三方库,这些第三方库又会引入别的库,就可能出现版本不一致的问题。 Gradle在处理这种依赖冲突的策略是以版本最高(或指定)的版本打进APK包中。 这些问题在编译时无法发现,所以可能在运行时出现ClassNotFound,MethodNotFound之类的异常。例如:一个APK项目中,引入了ImageLoader和Album两个第三...

2018-07-10 22:37:41 356

原创 Retrofit源码分析--Retrofit动态代理与CallAdapter的实现

目前打算选用Retrofit2+RxJava2作为网络请求框架,下面从源码角度分析下这两个框架是怎么粘合在一起的。看完本文,你将会看到: - 动态代理模式在Retrofit中的运用。 - 抽象工厂模式在Retrofit中的运用。 - RxJava2如何和Retrofit结合实现网络请求模块。使用Retrofit实现网络请求定义一个Service接口//ht...

2018-07-02 23:03:12 302

原创 AOSP源码编译 --全部编译

最进一直在学习Android系统源码,当然搭建编译环境是第一步,我也是折腾了好久,个人觉得这个在学习Android过程中有里程碑意义的,因为以后过程中,自己的一些想法就能动手实现了。下载Android源码如果是MAC OS的话,需要在创建一个磁盘映像使用自带的磁盘工具,创建磁盘映像即可。 也可以使用命令行进行创建hdiutil create -type SPA...

2018-06-18 17:49:38 6318 2

原创 Android 解决Touch事件传递不连贯的问题

在事件分发的过程中,用于Android特有的事件分发机制,可能出现两个问题:子View在滑动过程中产生requestDisallowTouchEvent()导致父View没有办法拦截到事件的问题(父View没有回调onInterceptTouchEvent())。父View拦截事件并消耗,此时达到某个临界值,父View不再需要事件,但是子View无法从ACTION_MOVE事件直接开始处理...

2018-04-01 18:33:57 606

原创 Android DLPlugin框架源码分析

参考:http://blog.csdn.net/singwhatiwanna/article/details/23387079 本文对DLPlugin插件化框架原理进行分析,DLPlugin实现简单,是我们探索插件化机制的第一步。使用ClassLoader加载插件类初始化DexClassLoader这里假设插件类在SDCard上,我们可以使用DexClassLoade...

2018-03-18 21:28:30 300

原创 Android 进程创建流程(Context的创建)

Android APP进程的创建由ActivityThread这个类完成,下面本文分析下ActivityThread的初始化流程。流程介绍通过下面的流程图简单看下这个ActivityThread初始化的过程。 关键点:ActivityThread和AMS均为Binder对象,但是IActivityThread上有oneway关键字,所以系统调用IActivityThre

2018-02-04 20:59:29 801

原创 Sugar ORM框架源码分析

Sugar目前来看是一个不错的ORM框架,我们分析下它的框架设计吧,通过分析框架一定能加深我们对代码的理解。Sugar的使用 http://satyan.github.io/sugar/getting-started.html整体来看Sugar的好处就是简单,毕竟它是基于反射实现的,但是可能会造成一定的性能问题。下面边根据使用来分析下实现。Mainfest文件中

2018-01-13 21:49:28 941 1

原创 Mediator Pattern-中介者模式

中介者模式(行为型模式): 用一个中介者对象封装一系列的对象交互, 中介者使个对象不需要显示进行相互作用, 从而降低各类之间的耦合,可以独立的改变他们的交互中介者模式的组成抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法。从一个同事类接收消息,然后通过消

2017-10-08 22:39:50 198

原创 Android BitmapFactory 解码总结

使用BitmapFactory解码图片解码本地图片final BitmapFactory.Options option = new BitmapFactory.Options();// inDensity表示当前的Bitmap的像素密度option.inDensity = DensityUtil.densityDpi;// 使用inScale=true, 表示解码图片时允许图片缩放// op

2017-09-13 22:43:41 550

原创 Android Z轴布局

如果需要在布局中创造一个层叠的概念,那么使用Android系统中的ViewGroup是不够的,但是可以通过改变ViewGroup的绘制顺序实现继承自FrameLayoutFrameLayout已经帮我们实现了子View的measure和layout过程,我们只需在它的基础上改变绘制顺序即可自定义LayoutParamslayoutParams的作用是向父布局请求布局参数(MeasureSpec),

2017-09-09 21:30:40 5181

原创 自定义View实现百度Loading动画

基本绘制实现思路:先绘制背景色文字,然后讲Canvas裁切这个path路径,然后绘制白色的文字绘制正弦曲线这里使用贝塞尔曲线实现正弦曲线的绘制,使用ValueAnimator不断通知重绘 private Path getActionPath(float curPercent) { final Path path = new Path(); int x = -mWid

2017-08-13 22:07:41 301

原创 ViewDragHelper使用简介

ViewDragHelper 使用ViewDragHelper可以轻松的实现拖动效果简单DemoXML中定义<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="

2017-08-05 21:51:24 216

原创 getLocationInWindow()与getLocationOnScreen()

获取View在屏幕上的坐标(左上角)int[] location = new int[2] ; view.getLocationInWindow(location); //获取在当前窗口内的绝对坐标,getLeft , getTop, getBottom, getRight, 这一组是获取相对在它父窗口里的坐标。 view.getLocationOnScreen(location);//获取在

2017-07-31 22:14:59 267

原创 Js实现Ajax

AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。XMLHTTPRequest对象所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。 XMLHttpRequest 用于

2017-06-30 18:29:39 267

原创 Js实现贪吃蛇游戏

使用Js面向对象的思想设计了一个贪吃蛇游戏,算是对Js面向对象的总结吧.地图设计地图绘制直接使用js绘制div区域,然后填充背景即可./** * 游戏地图 * @constructor */function Map(width, height) { this.width = width; this.height = height; this.showMap = func

2017-06-28 21:55:04 293

原创 Android 自定义View实现波浪动画

效果演示代码调用与实现效果xml中调用 <developer.shivam.waveview.Wave android:layout_width="match_parent" android:layout_height="match_parent" app:amplitude="100" app:quadrant="0.5"

2017-06-21 14:06:21 1943

原创 RxJava 简单订阅-发布Demo

职责介绍Observable RxJava中存在最广泛的事件源,可以使用just()或者’from()’创建,创建出Observable对象以后,使用就可以使用subscribe(),添加订阅对象了.Subject RxJava中的事件源和观察者的结合体,可以使用onNext()进行监听和发射对象,使用subscribe()添加订阅对象.初始化subject和Observable

2017-06-20 11:59:06 462

原创 BitmapFactory option详解

BitmapFactory.Option 中用于对Bitmap解码中的各选项进行配置.inJustDecodeBounds如果将这个值置为true,那么在解码的时候将不会返回bitmap,只会返回这个bitmap的尺寸。这个属性的目的是,如果你只想知道一个bitmap的尺寸,但又不想将其加载到内存时。这是一个非常有用的属性。inSampleSize这个值是一个int,当它小于1的时候,将会被当做1

2017-06-10 11:54:44 638

原创 RxJava 和 Retrofit的调用示例

一个简单的Demo演示RxJava和Retrofit如何相互配合Retrofit初始化我把Retrofit的初始化写在了Application中, 目的是使用这个Retrofit的单例private void initRetrofit() { // 创建Retrofit final Retrofit retrofit = new Retrofit.Builder()

2017-06-08 18:13:30 456

原创 AppbarLayout实现基本的头部跟随列表滚动效果

AppBarLayout继承自LinearLayout,布局方向为垂直方向。所以你可以把它当成垂直布局的LinearLayout来使用。AppBarLayout是在LinearLayou上加了一些材料设计的概念,它可以让你定制当某个可滚动View的滚动手势发生变化时,其内部的子View实现何种动作。请注意:上面提到的某个可滚动View,可以理解为某个ScrollView。怎么理解上面的话呢?就是说

2017-05-20 22:04:21 1838

原创 Java位运算符总结

Java中的位操作符&(与)操作两个操作数中位都为1,结果才为1,否则结果为0public class data13{ public static void main(String[] args) { int a=129; int b=128; System.out.println("a 和b 与的结果是:"+(a&b));

2017-05-07 18:40:03 345

原创 ButterKnife的使用

使用ButterKnife可以直接对View进行绑定,简化我们项目中的代码量. 参考:http://jakewharton.github.io/butterknife/@BindView的使用View的绑定@BindView是一个属性注解,作用是将View和它的id进行绑定class ExampleActivity extends Activity { @BindView(R.id.ti

2017-05-05 21:00:20 276

原创 Linux 查看当前登录用户

w查看当前系统信息和用户登录信息root@iZwz7ebvlaZ:~# w# 第一行,系统当前运行的基本信息# 时间 | 距离上次重新启动的时间 | 上次启动时间 | 当前在线用户数 | 系统负载程度,接近0表示负载越低 20:39:49 up 10 days, 5:25, 4 users, load average: 0.00, 0.01, 0.05# 显示用户的详尽信息# TTY

2017-05-02 20:51:36 38124

原创 Android 中Jni与Java运算性能比较

完整demo地址 https://github.com/yangtianrui95/JniPerformance JniPerformance Jni performance testUsing dense floating-point calculations to test the performance differences between Jni and pure java,

2017-04-08 21:19:32 1380

原创 Base64编码原理与应用

Base64 编码特点标准base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号;base64是把3个字节变成4个可打印字符,所以base64编码后的字符串一定能被4整除(不算用作后缀的等号);等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,base64要在后面添加\0凑齐3n位。 为了正确还原,添加了几个\0就加上几个等号。显然添加等号的数

2017-04-04 18:40:48 285

原创 C 中 getopt_long()用法

在C程序中,getopt_long()支持长选项的命令行解析,是C程序在命令场景下的必须掌握函数之一.函数原型如下:#include <getopt.h>int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *l

2017-04-04 12:55:39 376

原创 Groovy的语法入门

简单地说,Groovy 是下一代的Java语言,跟java一样,它也运行在 JVM 中。 作为跑在JVM中的另一种语言,groovy语法与 Java 语言的语法很相似。同时,Groovy 抛弃了java烦琐的语法。声明变量作为动态语言,groovy中所有的变量都是对象(类似于.net framework,所有对象继承自java.lang.Object),在声明一个变量时,groovy不要求强

2017-03-26 21:59:53 1108 1

原创 Linux 平台下JNI的使用

本文简单介绍下Linux平台下JNI开发环境的搭建声明一个native方法 public static native void helloJni();使用javah 工具生成C/C++ .h文件先 cd到当前的src目录下 然后# tianrui.JniTest 是这个类的包名 /src$ javah -classpath . -jni tianrui.JniTestjavah 调用完成后,

2017-03-26 21:10:10 598

原创 git 交互式rebase

交互式的rebase的场景在分支开发时特别有用, 可以减少没有必要的提交git rebase -i-i 参数表示互动 interactive,这时 git 会使用你设定的编辑器,让你对 git 历史记录做详细修改。下面以在master分支和dev分支之间的切换为例,演示git rebase -i的使用// 从master分支上拉取新的dev 分支用作开发git checkout -b dev//

2017-03-26 00:23:27 562

转载 Android 常用技巧

转自: https://github.com/cctanfujun/android-tips-tricks-cnandroid-tips-tricks-cn一些很不错的Android开发技巧,这个项目翻译自 android-tips-tricks 去掉了一些我认为不重要的,对我使用过的东东做了评价,同时翻译了一些自己没有注意到的知识点的文章。:heart: star 支持一下 欢迎协作了解

2017-03-19 23:08:37 698

Genymotion-ARM-Translation.zip

2016-05-23

android-support-v7-appcompat.jar

android-support-v7-appcompat.jar

2016-05-21

空空如也

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