自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

QAQ

带着华农精神去学习!

  • 博客(68)
  • 收藏
  • 关注

转载 Android 显示原理简介

现在越来越多的应用开始重视流畅度方面的测试,了解Android应用程序是如何在屏幕上显示的则是基础中的基础,就让我们一起看看小小屏幕中大大的学问。这也是我下篇文章——《Android应用流畅度测试分析》的基础。     首先,用一句话来概括一下Android应用程序显示的过程:Android应用程序调用SurfaceFlinger服务把经过测量、布局和绘制后的Surface渲染到显

2017-07-12 20:12:37 545

原创 关于WindowManager在Android N和Android N以下表现差异的分析总结

1. 问题描述通过WindowManager往窗口里添加浮动按钮,在Android7.0时该按钮可以全局保留,直至进程被杀掉。而Android7.0以下(以Android4.4为例)浮动按钮随Activity的onStop()方法被覆盖。 以下为浮动按钮的实现代码:WindowManager mWm = (WindowManager)mContext.getSystemService(Contex

2017-07-12 12:58:14 1102

原创 深入分析HTTP与HTTPS

在详细探究HTTP与HTTPS之前,先理清一下HTTP的基本概念: HTTP是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目

2017-03-22 17:49:04 768

原创 关于OkHttp缓存post请求的问题

现有这样一个要求,使用Retorfit+okhttp需要在有网的时候能够连接服务器,读取相关信息;在没网络断开的时候需要读取Okhttp的缓存来达到离线的效果。 基于上述的需求,可以使用Okhttp的拦截器来实现://设置缓存目录File cacheFile = new File(BaseApplication.getContext().getCacheDir(), "cache");Cach

2017-03-01 18:36:56 9044 4

原创 Volley源码解析

Volley是Google开发的一个网络请求框架,该框架适合进行小而频繁的网络请求。 Volley的使用比较简单,只需几个简单的操作就可以实现发送请求。以StringRequest 为例://创建一个请求队列RequestQueue requestQueue = Volley.newRequestQueue(this); String url = "request_url";

2017-02-07 16:33:55 359

原创 模板方法模式

有些时间没有更新技术博客了,上段时间都在忙考试。 这次继续学习新的设计模式————模板方法模式。依旧先从一个UML图开始: 其中: AbsTmplate:定义了逻辑的框架 ConcreteImplA:具体实现A ConcreteImplB:具体实现B举个例子,现有几部电脑,每部电脑的操作系统不相同,但是每部电脑的开机流程都相同。比如打开电源,装载系统,登录系统。 首先,就

2017-01-22 11:59:49 301

转载 从源代码分析Android-Universal-Image-Loader的缓存处理机制

从源代码分析Android-Universal-Image-Loader的缓存处理机制本博客转自http://www.cnblogs.com/kissazi2/p/3931400.html讲到缓存,平时流水线上的码农一定觉得这是一个高大上的东西。看过网上各种讲缓存原理的文章,总感觉那些文章讲的就是玩具,能用吗?这次我将带你一起看过UIL这个国内外大牛都追捧的图片缓存类库的缓

2016-12-27 19:30:15 335

原创 RxJava&Retrofit错误预处理

RxJava和retrofit配合使用进行网络请求在实际开发中还是很强大的。在实际开发中,再对网络请求返回的结果往往要先进行预处理。即先过滤了错误的信息,在执行onNext()方法时只需要考虑正确的结果下如何处理就行。 以一个正常的Json返回为例:{ "status": 1, "errmsg": "OK", "data": {...}}{ "status": 0

2016-12-22 15:11:48 1808

转载 简单明了,彻底地理解Binder

你是不是看过很多Binder文章但是还是对Binder没有一个深刻理解?不是那些文章讲得不够好,主要是存在两种情况,一种是讲的深,全C代码~,对我这种专做Java的人来说没有心情往下看;另一种是只讲framework层,Binder驱动并没有具体提,导致我们会用Binder,也大致能说的出一些原理,可并没有一个完整的深刻认知。那么接下来让我们一起学习Binder吧,相信接下来的内容会让你有一定的收

2016-11-27 12:45:15 438

原创 关闭线程的正确方式?

最近无意间看到一些面试题,提到如何关闭一个线程。然后就在想,关闭线程不就是调用Thread.stop()的方法就好了吗?现在看来还真是有些问题了。翻了下Effective java那本书,了解到原来stop方法在很久之前就不提倡使用,因为这个方法是不安全的。 那么,要怎么去关闭一个正在执行的线程呢?一开始就想到用一个boolean变量去控制:public class ThreadExample e

2016-11-25 13:14:59 11614 2

原创 自定义ViewGroup

上一篇了解了如何去实现自定义View,这篇就了解下如何自定义一个ViewGroup。其实,自定义View和ViewGroup都需要从View的绘制机制来入手,可见了解绘图机制对于自定义View和ViewGroup的作用还是很大的。自定义ViewGroup主要在onMeasure和onLayout两个过程下手。通过onMeasure来确定好视图的大小,通过onLayout来确定每个视图的位置。 这

2016-11-20 21:05:25 410

原创 自定义View

花了几个小时的时间总算把自定义View给理清楚了,以前总是没时间去看,网上总是一大把写好的控件。 在学习自定义View之前还需要回顾一下关于View的绘图流程相关知识。View的绘图流程有三个onDraw,onLayout还有onDraw。可以这样简单地描述这三个过程: onMeasure:计算出视图的大小。 onLayout:确定试图在屏幕中的显示位置。 onDraw:将控件绘

2016-11-20 20:47:37 408 1

原创 使用RxJava+Retrofit+MVP+Glide开发一个简单的新闻客户端

好久没有更新博客了,有点懒。。之前在网上看到很多有趣又高效的开源库,于是就想着写一个简单的项目来运用这些开源库,恰巧看见聚合数据上有个新闻头条的API,所以就尝试写了一下。先上效果图:在这个小项目中,使用RxJava和Retrofit网络请求框架来实现异步数据的获取是比较重要的环节。 关于RxJava和Retrofit的使用可以参考:http://gank.io/post/56e80c2c6776

2016-11-18 12:37:39 2778

原创 深入线程池

之前在读Java进阶书籍的时候,接触到了关于线程池的使用,但是一直没有进行系统的理解。这篇博客主要是对线程池功能的梳理。 使用线程池来执行任务相对于线程来讲有许多优点: 1.能够重用线程池里的线程,减少创建线程的开销。 2.可以控制线程池中的最大并发数。 3.可以对线程进行简单的管理。线程池的简单使用public class Test { public static void mai

2016-10-26 15:42:20 369

原创 观察者模式

最近在学习使用RxJava的时候,了解到其功能的强大,可以简化很多的代码,让逻辑更清晰。其中,RxJava内部实现则用了观察者模式来实现。因此,在深入学习RxJava前就先把观察者模式理清楚先。 观察者模式中首先有两个角色,一个是被观察者(Subject),另一个是观察者(Observer)。顾名思义,观察者可以通过被观察者的动作来做出反应。举个例子,公司老板发布通知,是被观察者,而员工们是通知接

2016-10-15 15:01:46 348

原创 使用AIDL跨进程通信

之前对IPC的研究有接触到AIDL,AIDL的作用实际上就是跨进程通信,因为进程间是各自维护着自己的一个内存,当前进程想要访问到其他进程的内存,就可以通过AIDL来实现。 假定现在进程1(服务端)中有一个学生信息的集合,现在要在进程2(客户端)通过学生ID获取到进程1中集合中某个学生的信息。下图为结构图: 首先,需要创建Student类://必须序列化,不然无法传输二进制对象public

2016-10-14 19:26:30 474

原创 HashMap原理分析

HashMap在开发中算是一个很常见的数据结构,从字面上的Hash这个单词都可以大概推测出其内部使用的数据结构会有哈希表。之前也对其内部实现思想有一定了解,除了哈希表外,也用到了链表来实现保存相同hash值的键所对应的键值对。 简单地回顾下哈希表: 哈希表的实现无非是个数组,每个值都会通过散列函数来获取对应的数组下标,从而存在数组的相应位置。一旦两个值的哈希值相同,就会用链表连接起来。如上图

2016-10-12 22:30:42 784

原创 Java垃圾回收算法

垃圾回收目的在于回收那些无用对象占用的内存,以释放出空间,减缓程序设计的压力。既然Java实现了垃圾的自动回收,那么就有必要了解一下它是如何实现垃圾回收的。如何判断对象“已死”?在垃圾收集器对堆进行回收前,首先需要做的事情就是判断哪些对象已经不会再被使用。主要有两种方式实现判定:引用计数算法给每个对象添加一个引用计数器(初始值为1),每当有一个地方引用它的时候,计数器就加一。每当引用失效时,计数器就

2016-10-02 16:07:21 495

原创 Java内存模型

由于CPU与存储器的运行速度差异的存在,需要引用高速缓存来解决。而引入高速缓存之后,又会带来缓存一致性的问题,即多个处理器有着自己的高速缓存,但却共用一个主存。Java内存模型在Java虚拟机中是怎么解决上述问题的?先用一个图来引用Java的内存模型: 首先,对几个名词进行梳理: 主内存:Java内存模型中规定了所有的变量都必须存储在主内存中,可以类比硬件中的内存。 工作内存:每条线程都有

2016-10-02 11:49:12 365

原创 浅析ClassLoader

类加载过程中加载阶段是最可控的一个阶段,可以由系统的类加载器来加载,也可以用户自定义加载,目的都是为了将二进制字节流读入内存中。在加载类时,是通过ClassLoader的loadClass()方法来实现的。ClassLoader的简单使用那系统提供的类加载器与用户自定义的类加载器加载的类有什么区别呢?那么尝试自己手动创建一个类加载器来加载类:public class ClassLoaderTest

2016-10-01 00:41:02 373

原创 JVM类加载机制

虚拟机把描述类的数据从class文件加载到内存,并进行数据校验,转化解析和初始化,最终形成被虚拟机直接使用得Java类型,这个过程就是体现了虚拟机的类加载机制。类加载经历了哪些过程?类从被加载到虚拟机内存中开始,到被卸载出内存为止,总共经历了一下这些阶段:加载、验证、准备、解析、初始化、使用、卸载。其中验证、准备、解析三个部分统称为连接,如下图所示: 其中,加载、验证、准备、初始化和卸载这5个

2016-09-30 20:54:35 333

原创 深入Java内存区域

接触Java不久,就了解到Java内存区域的简单划分,如寄存器,堆,堆栈等。在阅读《深入理解Java虚拟机》后,对于内存的划分又有了新的理解。运行时数据区域Java虚拟机在执行Java程序时会把内存划分为几个不同的数据区域,分别为程序计数器,虚拟机栈,本地方法栈,堆,方法区。而除了程序计数器之外的每个区域都会有内存溢出的现象,通过下图可以对其内存区域进行分类: 程序计数器程序计数器是一块较小的空间

2016-09-28 13:01:34 392

原创 BroadcastReceiver应用

初学Android时对于BroadcastReceiver的认识很浅,基本上是知道有广播这个东西,而没有实际应用过。最近在实践中也感觉BroadcastReceiver的强大,所以需要重新对广播的知识进行一下梳理。 BroadcastReceiver意味“广播接受者”,可以用来接收用户定义的广播或是系统的广播。系统中也存在很多类似的广播机制,比如提醒用户低电量,当电量改变时,会发送一条广播,而接收

2016-09-16 14:06:59 376

原创 责任链模式——事务处理

假设有这么一个场景,学生们有个问题,需要去处理。有大多数情况下学生个人就能搞定这个通知,如果不行就让班长帮忙。班长也无能无力的时候就可以去找到辅导员,最终解决学生的问题。这中间就形成了一个职责链,当前级别无法处理问题时,就往上交付,知道解决为止。在程序中也可以通过责任链模式来把上述的场景展现出来。 UML图: 具体的代码实现如下:/***代表职务或者是请求(问题)的等级*/public

2016-09-12 10:16:37 1315

原创 策略模式——商品促销

许多商家为了提高知名度或是其他原因会进行商品促销活动。而有时对于新老客户的促销策略又有所不同。比如新客户打9折,老客户打8折。(当然,这只是比喻)我们可以用简单的程序来表示这种促销活动。public class Merchandise { //新客户 public final static int NEW_CUSTOMER = 0; //老客户 public fina

2016-09-10 14:43:40 1176

原创 原型模式——文档复制

文档是我们在计算机上记录文字等一个工具,通常一份文档有一个大标题,也有许多个副标题。文档的复制拷贝也很常见,那么怎么在程序设计中运用原型模式来模拟文档的复制呢? 首先,通过UML图大概了解一下原型模式吧: Client:客户端类 Prototype:抽象类或接口,实现了Cloneable接口 ConcretePrototype:具体的原型类 既然需要模拟文档复制,那么就需要先建立

2016-09-10 00:13:24 434

原创 Builder模式——组装电脑

又是一个开学季,新生们都纷纷入学了。上了大学,买电脑便是每位学生要考虑的事情,作为计算机学院的一员,自然想买配置高点的电脑用来编码,这样会使用得舒服很多。可是手头又紧,想买配置好的电脑有时就会考虑自己去组装电脑。 那么,在这里就用Builer(建造者)模式来描述一下组装电脑这件事。先贴个UML图: 首先,需要一个抽象类——电脑:public abstract class Computer {

2016-09-06 21:25:59 1435

原创 代理模式——游戏代练

相信大多数年轻人都喜欢玩游戏。当然笔者也不例外,曾经还有一段时间玩游戏玩到废寝忘食呀。可惜,终究是手残党,游戏怎么都玩不厉害。正是玩游戏的人很多,所以就出现了代练这个职业,把游戏交给代练的人,就能轻松的把游戏玩到一个更高的阶段。这是生活中的一种代理。 而在程序设计中,我们就与生活相结合,来用代练描述一下程序设计中的代理模式。 UML图: 首先,先创建一个接口,这个接口代表着所有的玩家共有的

2016-08-24 18:43:15 1620

原创 IPC机制(一)

最近在了解Service时接触到Android IPC,IPC全称是Inter-Process Communication,意思是进程间通信,当然也包括了跨进程通信。要了解IPC,首先需要知道的是Android中开启多进程模式的方式。开启多进程想要在一个应用程序中开启多个进程,在Android中有这一种方法:即在AndroidMenifest.xml中给四大组件指定一个android:process

2016-08-24 15:23:42 887

转载 Android Volley完全解析,带你从源码的角度理解Volley

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17656437经过前三篇文章的学习,Volley的用法我们已经掌握的差不多了,但是对于Volley的工作原理,恐怕有很多朋友还不是很清楚。因此,本篇文章中我们就来一起阅读一下Volley的源码,将它的工作流程整体地梳理一遍。同时,这也是Volley系列的最后一篇文章了。

2016-08-13 16:36:20 480

原创 浅析View工作原理

View是android os里一个重要的组成部分,在开发过程中我们经常会用到的一些View组件就有TextView,Button,ListView等等。有些组件经过设计后会展示出更好的视觉效果。那么我们会感到疑惑,一个组件肯定不会凭空产生,那么我们在代码使用了这些组件后它们又经历了一个怎样的过程才使得它们能够在屏幕上展示出来呢? 首先,需要知道的是View的绘制流程是从ViewRootImpl这

2016-08-12 13:15:44 540

原创 实现带右滑功能的ListView

近来看到QQ的联系列表的右滑功能很不错,于是就想着自己也设计一下,看看怎样才能实现这种右滑的功能,参考了网上的一些资料,搞定了各种bug,终于实现了一个简单的带右滑功能的ListView。先附上效果图吧: 以下是实现该功能的源码: SwipeListView.javapackage com.custom;import android.content.Context;import andro

2016-08-01 19:06:42 991

原创 汇编实现排序——希尔排序

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 以下是汇编实现的代码:S0 SEGMENT STACK DW 20 DUP(?)TOP LABEL WORDS0 ENDSS1 SEGMENTTIP DB "Input ten number and sep

2016-06-21 23:22:49 3951

原创 汇编实现排序——冒泡排序

冒泡排序算法的运作如下:(从后往前) 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 3.针对所有的元素重复以上的步骤,除了最后一个。 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 以下为实现代码:S0 SEGMENT STACK DW

2016-06-21 23:20:32 40898 5

原创 汇编实现排序——直接插入排序

上一篇实现了简单插入排序的算法,这一篇主要实现直接插入排序算法:S0 SEGMENT STACK DW 20 DUP(?)TOP LABEL WORDS0 ENDSS1 SEGMENTTIP DB "Input ten number and separate the numbers with space:", 0DH, 0AH, 24HARY DW 20 DUP(0)

2016-06-21 23:17:42 5635

原创 汇编实现排序——简单选择排序

上阵子重温数据结构,差不多更新到排序。这学期学了汇编语言,其中有几个实验便是实现内部排序算法。以下是实现简单选择排序的程序设计:S0 SEGMENT STACK DW 20 DUP(?)TOP LABEL WORDS0 ENDSS1 SEGMENTTIP DB "Input ten number and separate the numbers with space:",

2016-06-21 23:14:28 10077

原创 关于Volley二次封装的一些想法

最近忙于课程和项目,好久没有更新博客了。最近在项目中使用了Volley框架来请求数据,一开始接触Volley感觉使用起来挺简单,只需几个简单的操作就可以实现发送请求。以StringRequest 为例://创建一个请求队列RequestQueue requestQueue = Volley.newRequestQueue(this); String url = "这里是请求的链接.

2016-05-24 20:20:16 768 1

原创 深入探索AsyncTask

关于AsyncTask,相信大家都不陌生。由于Android UI线程的不安全性,所以如果想要在子线程中更新UI,就必须使用异步消息处理的方式。之前研究了Handler的处理机制(http://blog.csdn.net/u010429311/article/details/51288479),对于AsyncTask的理解还是挺有帮助的。在这里,我们继续深入的理解AsnycTask的工作原理。在此之

2016-05-01 14:24:00 829

原创 探索Handler机制原理

众所周知,Android是不能在主线程进行耗时操作,否则会抛出ANR(应用程序无响应)异常。于是,我们在程序开发中就会广泛地使用Handler来实现异步消息的处理,如读取网络数据并加载到程序的UI界面中。Handler的运行需要MessegeQueue和Looper的支撑,关于其三者的关系,接下来将通过源码来具体分析。 首先,我们来看一个使用Handler的情况:public class Main

2016-04-30 23:03:07 1953

原创 实现带标题的ListView

在一些项目中,往往有要求为ListView里的内容分类,比如按日期分类,就要把相同日期的项目放在一起。可以看一些示例图,会清楚一些: 以上根据标题来进行分类,实现代码如下:首先是数据项的模型:public class Data { private String text1, text2, text3; //数据1 2 3 public Data(String text1, Str

2016-04-25 21:06:05 10913 6

空空如也

空空如也

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

TA关注的人

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