自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小北的博客

守稳初心,方能-守得云开见月明

  • 博客(118)
  • 资源 (1)
  • 收藏
  • 关注

原创 最长递增子序列-Java 实现

1、Θ(n2) 打表实现初始化对角线为 1; 对每一个 i,遍历 j(0 到 i-1): 若A[i] <= A[j],置 1。 若A[i] > A[j],取第 j 行的最大值加 1。private static int getLargestLen(int[] array) { int[] max = new int[array.length]; fo...

2018-03-06 11:50:42 4867 1

原创 Java并发:volatile解析

一、Java 内存模型Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。二、并发编程中的三个概念1、原子性一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。...

2018-03-01 16:04:12 352

原创 计算器的实现-Java 代码

用Java 实现的计算器,原理看代码注释public class MyCalculator { public static void main(String[] args) { String obj = "6+(8/2)+6/3+1*8 + 30"; ArrayList arrayList = strFormat(obj); Syste

2018-01-16 17:30:24 9393 1

原创 Android 源码解析 - ScrollView

ScrollView 可以在垂直方向做滑动显示内容,并且ScrollView中只能添加一个子View,下面对源代码进行分析。源码解析ScrollView 继承关系onMeasure方法@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.on

2018-01-15 20:13:33 571 2

原创 Android 源码解析 - Scroller

分析版本 : Android API 26介绍Android开发中,如果我们希望使一个View滑动的话,除了使用属性动画外。 我们还可以使用系统提供给我们的两个类Scroller和OverScroller用来实现弹性滑动。下面分析一下Scroller的使用方法以及实现方式。View中的scrollBy()和scrollTo()方法介绍/** * Set the sc

2018-01-12 21:47:30 320

原创 最小堆解决TopK 问题 - Java代码实现

TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据。解决方法一、对源数据中所有数据进行排序,取出前K个数据,就是TopK。解决方法二维护一个K长度的数组a[],先读取源数据中的前K个放入数组,对该数组进行升序排序,再依次读取源数据第K个以后的数据,和数组中最小的元素(a[0])比较,如果小于a[0]直接pass,大于的话,就丢弃最小的元素a[0],利用二分法找到其位

2018-01-11 20:11:07 1581

原创 Android 动画 一篇就够

动画实际上就是在指定的时间段内持续修改某个属性的值, 使得该值在指定取值范围内平滑过渡。 动画可以分为三大类, 帧动画(Frame Animation)、补间动画(Tweened Animation)、属性动画(Android 3.0 之后增加的属性动画)帧动画帧动画是最容易实现的一种动画,这种动画更多的依赖于完善的UI资源, 原理是一定的时间段内切换多张有细微差异的图片从而在视觉上

2018-01-11 11:38:32 300

原创 gradientRadius 的适配问题

gradientRadius percentages 支持Android 5.0之后的系统,如果是之前的需要使用自定义View。自定义View 如下:public class RadialGradientView extends View { private final int endColor; private final int startColor; priv

2018-01-04 20:31:31 1347

原创 避免使用startActivityForResult

startActivityForResult 所有处理结果的逻辑都要放到onActivityResult中,在onActivityResult里面根据requestCode作不同处理,这样逻辑比较复杂, 我们希望的是能在发起startActivityForResult的时候捎带着把获取结果后处理的逻辑也传进去,并能在内部做处理。下面我们参考RxPermissions的做法给出了一种解决方法 Git

2018-01-04 10:42:19 1095

原创 设计模式-建造者模式

定义官方定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,通俗的说就是:建造者模式就是如何一步步构建一个包含多个组成部件的对象,相同的构建过程可以创建不同的产品特点建造者模式是一种创建型模式,适用于那些流程固定,建造的目标对象会有所改变这种场景,还有一种场景是代替多参数构造器作用1、用户不知道对象的建造过程和细节就可以创建出复杂的对象「屏蔽了建造的具体细节」 2、用户

2017-12-20 19:28:54 276

原创 Java 内存模型

第一部分 内存模型我们常说Java内存模型(Java Memory Model, JMM)指的是Java运行时(Java runtime)内存模型,Java源码通过javac 翻译成字节码,由即时编译器(JIT)编译执行。因为字节码是静态代码,需要加载到内存才能成为可以动态运行的对象。运行时内存数据区大体上被分为5个区域、两大类型, 如下图。线程私有(隔离)数据区1、程序计数...

2017-12-15 14:44:15 408

原创 Android 框架-ImageLoader 图片加载框架

Android 开发中我们会经常会加载网络图片的需求,目前成熟的图片加载框架有 Fresco、Glide、Picasso, 比较老的还有UniversaclImageLoader(15年开发的时候还在用这个开源库,可惜现在已停止维护了)。由于最近想分析下Glide 的源码,之前有没有分析过图片加载框架,所以就自己参考网上简单的图片加载框架自己写了一个ImageLoader,分析下图片加载的基本原理和

2017-10-30 16:49:38 644

原创 有状态对象和无状态对象

1、进程与线程的关系进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动, 进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 进程有独立的地址空间进程有单独的地址空间,包括文本区域(text region

2017-10-27 18:47:32 785

原创 Android 源码解析-LruCache 缓存工具类

关于Android的三级缓存,其中主要的就是内存缓存和硬盘缓存。这两种缓存机制的实现都应用到了LruCache算法,今天我们就从使用到源码解析,来彻底理解Android中的缓存机制。1、LruCache的介绍LruCache是Android API 12以后提供的一个缓存工具类,采用了最近最少使用算法。它把最近使用的对象用“强引用”存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值

2017-10-25 16:37:35 527

原创 Glide 源码解析(一) 加载流程

Glide介绍Glide 是Google 员工 bumptech 开源的一款图片加载框架,相对于UniversalImageLoader,Picasso,它还支持video,Gif,SVG格式,支持缩略图请求,旨在打造更好的列表图片滑动体验。Glide有生命周期的概念(主要是对请求进行pause,resume,clear),而且其生命周期与Activity/Fragment的生命周期绑定,支持Vol

2017-10-13 09:46:28 955

原创 Mac上一键反编译Apk与查看jar文件

将需要反编译的Apk(**.apk无需重命名) 拷贝到 apk 文件夹下,然后运行run.sh 脚本,反编译完成后会自动打开Gui 工具查看反编译后的文件。拷贝文件运行脚本反编译后的结果工具下载地址

2017-10-11 20:10:20 4066

原创 经典的Java算法面试题

1、新浪面试题:编写一个方法,计算一个字符串中,第一个不重复的字符在当前字符串中的索引。public class JavaTest { //贪心算法 编写一个方法,计算一个字符串中,第一个不重复 的字符在当前字符串中的索引。 public static String array = "abuacdeaudbdfcefhph"; public static int[] conta

2017-10-11 17:35:51 7178 8

原创 Android 布局优化-ViewStub 视图

ViewStub 是一个轻量级的View,View 的宽高为0,不绘制任何东西,只是占一个位置而已。优势 在需要的时候才加载View,这样实现了View的延迟加载,避免资源的浪费,减少渲染时间, 因此可以提高页面的加载速度。不足 ViewStub所要替代的layout文件中不能有标签, ViewStub在加载完后会被移除,或者说是被加载进来的layout替换掉了用法实例<LinearLayou

2017-09-27 14:13:46 598

原创 Android 数据库升级数据迁移以及数据库导入

在我们开发的应用中,一般都会涉及到数据库,使用数据的时候会涉及到数据库的升级、数据的迁移、增加行的字段等。比如,用户定制数据的保存,文件的端点续传信息的保存等都会涉及到数据库。我们应用第一个版本是V1.0,在迭代版本V1.1 时,我们在数据库中增加了一个字段。因此V1.0的数据库在V1.1版本需要升级,V1.0版本升级到V1.1时原来数据库中的数据不能丢失,那么在V1.1中就要有地方能够检测出来版本

2017-09-26 17:47:05 1826

原创 Java 源码解析-ThreadLocal

ThreadLocal相当于提供了一种线程隔离,将变量与线程相绑定,它可以保证访问到的变量属于当前线程,每个线程都保存有一个变量副本,每个线程的变量都不同,而同一个线程在任何时候访问这个本地变量的结果都是一致的。当此线程结束生命周期时,所有的线程本地实例都会被GC。ThreadLocal 的基本用法public class ThreadLocal { private static java.l

2017-09-12 17:37:20 355

原创 Android 源码解析- Handler 实现机制

源码是Android API 25Handler 、 Looper 、Message 这三者到底有什么样的关系?什么叫异步消息处理线程呢?本文将在源码层面进行分析。Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能出现ANR。解决的方法是创建一个Message对象,然后通过Handler发送出去,之后在Handler的handleMessage()方法中获得刚才发送的M

2017-09-11 09:37:05 597

原创 Android 源码解析-AsyncTask

我们都知道Android 的子线程中是不能更新UI 的(当然也不是绝对的,在初始化的某个时机是可以的,稍后会根据源码进行分析为什么可以,期待吧),如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制。为了更方便的在子线程中更新UI元素,Android从1.5版本后引入了AsyncTask类,AsyncTask从本质上讲,是对ThreadPool和handler的封装,本文首先介

2017-09-07 18:07:04 532

原创 Android AIDL 使用详解

AIDL  AIDL (Android Interface Definition Language),Android接口定义语言,Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。为什么使用AIDL  使用AIDL只有在你允许来自不同应用的客户端跨进程通信访问你的service,并且想要在你的service种处理多线程的时候才是必要的。

2017-09-06 15:36:35 3317

原创 Android跨进程通信的四种方式

Android系统中应用程序之间不能共享内存,在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。1、其中Activity可以跨进程调用其他应用程序的Activity 2、Content Provider可以跨进程访问其他应用程序中的数据(以Cur

2017-09-05 16:36:32 5665

原创 Android 中的消息传递-广播机制

Android中的广播机制非常灵活,Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这个程序也只会收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的。

2017-09-04 09:13:49 1326

原创 Android Service的生命周期

Managing the Lifecycle of ServiceWhat is Service ?Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提

2017-08-30 15:35:00 720

原创 Android多线程断点续传原理解析

在下载大文件的时候,我们往往要使用多线程断点续传,保证数据的完整性,首先说多线程,我们要多线程下载一个大文件,就有开启多个线程,多个connection,既然是一个文件分开几个线程来下载,那肯定就是一个线程下载一个部分,如果文件的大小是200M, 使用两个线程下载, 第一个线程下载1-100M, 第二个线程下载101-200M。 我们在请求的header里面设置conn.setRequestPro

2017-08-29 21:28:52 2379

原创 2017 Android 面试题

滴滴MVP ☐ 广播(动态注册和静态注册区别,有序广播和标准广播) ☐ service生命周期 ☐ handler实现机制(很多细节需要关注:如线程如何建立和退出消息循环等等) ☐ 多线程(关于AsyncTask缺陷引发的思考) ☐ 数据库数据迁移问题 ☐ 设计模式相关(例如Android中哪里使用了观察者模式,单例模式相关) ☐ 微信的聊天数据在本地都是加密处理的(防止root了被破

2017-08-29 20:50:18 897

原创 n级阶梯,每次走一步或两步,问最多有多少种走法

重要的是理解这个逻辑, 第n布,走一步,即n-1,再求n-1个阶梯的走法, 走两步,即n-2,再求n-2个阶梯的走法, 以此,n级阶梯的走法是n-1个阶梯的走法与n-2个阶梯的走法的和。Java 代码实现如下:public static long getStepNumber(int n) { if (0 > n) { return 0; } if (n =

2017-08-29 20:34:50 6612 3

原创 深入理解 Android 系统升级

前言2013年7月至2015年6月在长虹担任Android系统研发工程师,主要负责长虹智能电视升级(OTA升级),研发平台是MST 628 和 MTK 5327等。摘要随着Android系统的快速发展,越来越多的智能终端设备搭载Android平台。Android系统升级的可以优化智能电视系统性能、更新系统内容。因此,Android系统升级在Android系统开发领域极其重要。如何保证Android系

2017-08-28 18:39:10 12499 1

原创 Java 排序算法-归并排序

算法思想归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并

2017-08-24 21:34:26 414

原创 Java 对象克隆(clone)

基本数据类型(boolean,char,byte,short,float,double,long)的复制很简单,比如:int width = 5;int height = width;基本数据类型进行这样复制是没有问题的。按照上面的方法进行对象的复制,首先自定义一个汽车类,该类有一个color 属性,然后新建一个汽车实例car,然后将car 赋值给car1 即car1= car; 代码和结果如

2017-08-22 10:12:08 5008 1

原创 插入-排序原理及Java 实现

基本思想通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。对于给定的一组记录,初始时假定第一个记录自成一个有序序列,其余记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直到最后一个记录插到有序序列中为止。算法描述:假定Lenght是数组A的长度,首先假设第一个元素被放置在正确的位置上,这样仅需从1到Lenght-1范

2017-08-16 20:06:09 389

原创 源码分析- Java 1.8 HashMap

HashMap介绍1、介绍HashMap容器类是Java开发人员使用频率较高的用于映射(键值对”KEY”-“VALUE”)处理的数据类型。HashMap是基于Hasing技术(Hasing),Hasing就是将很大的字符串或者任何对象转换成一个用来代表它们的很小的值,这些更短的值就可以很方便的用来方便索引、加快搜索。JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优

2017-08-14 17:11:53 317

原创 浅析Java 字节码

第一个问题:为什么Java 为什么可以跨平台?和C++ 相比,很重要的一点就是:C++ 编译生成的是纯二进制的机器指令,而Java 通过编译器编译生成的是非纯二进制的字节码(.class文件)。而这种基于Unicode的字节码是不依赖于特定的计算机硬件架构而存在的——这就意味着只要有JVM环境,你的字节码就可以在任何平台上运行。其次,Java字节码的二进制数据以固定的格式进行存储和传输,消除了字节顺

2017-07-27 21:10:13 1287

原创 Linux下查看编辑二进制文件

命令 hexdum命令的解释:hexdum -C file

2017-07-27 13:53:42 2447

原创 Android 应用性能优化--资源图片的内存管理

综述图片从来源上可以分成三大类:网络图片、手机存储中(EMMC 和Sdcard)的图片、APK资源图片,目前有很多成熟的图片加载库,主流的有Picasso 、Glide 、Fresco。但是没有覆盖APK资源图片。资源图片特征:1、一般在xml中引用 ,在Java中也是通过资源ID查找 。2、一般不使用异步记载,不会出现loading图这些中间状态。3、如果加载失败了那么APP Crash。由

2017-07-25 17:03:19 894

原创 Lint 静态代码检查工具

除了测试 Android 应用以确保其符合功能要求外,还必须确保代码不存在结构问题。结构混乱的代码会影响 Android 应用的可靠性和效率,增大维护代码的难度。例如,如果 XML 资源文件包含未使用的命名空间,则不仅占用空间,还会导致不必要的处理。其他结构问题,例如使用目标 API 版本不支持的已弃用的元素或 API 调用等,可能导致代码无法正常运行。Android Studio 提供一个名为 L

2017-07-24 19:48:57 1410

原创 Android源码分析-SparseArray<E>详解

SparseArray 实现原理在使用HashMap的时候IDE会给出如下提示:SparseArray 类注释如下: SparseArrays map integers to Objects. Unlike a normal array of Objects, there can be gaps in the indices. It is intended to be more memory

2017-07-24 16:31:36 577

原创 Android代码混淆之混淆规则

ProGuardAndroid开发的应用程序是用Java语言开发的, 由于Java代码是非常容易反编码的,为了很好的保护Java源代码,我们需要对编译好后的class文件进行混淆。ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器。它可以检测并删除未使用的类,字段,方法和属性。它可以优化字节码,并删除未使用的指令。它可以将类、字段和方法使用短无意义的名称进行重命名。这些步骤让代码更

2017-07-21 16:40:17 1984

Mac 上反编译Apk 以及查看反编译后的文件

Mac 上反编译Apk 文件以及通过gui查看反编译后的文件, 解压下载后的文件, 将要反编译的apk 放到apk文件夹下(无需重命名),然后运行run.sh 脚本, 反编译完成后会自动打开gui 来查看反编译后的文件

2017-10-11

空空如也

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

TA关注的人

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