NanoHTTPD源码解析

前言

在微信 、UC 等 APP 中,无法通过scheme 或者 AppLiks 调起我们的 APP,所以想在APP 内部建立起一个 LocalHttpServer,监听某个端口,web 通过访问本地的这个端口,完成通信,调用起一些服务

在 github 上发现了 NanoHttpd 项目,它仅仅使用一个类,完成了 server 的搭建。它使用的是Socket BIO(阻塞IO),一个客户端连接分发到一个线程的经典模型,而且具有良好的扩展性.

Read more   2017/5/4 posted in  Android

Java 内存分配策略

Java 程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配,对应的,三种存储策略使用的内存空间主要分别是静态存储区(也称方法区)、栈区和堆区。

Read more   2017/5/1 posted in  Java

Android CleanArchitecture --Dagger分析

为了更好的解耦。clean 架构 使用了 Daager2 进行依赖注入。将接口放在了 domain 层。而将具体实现放在了 data 和 Presentation 层。

Read more   2017/4/8 posted in  Android

Android 测试 (四)-- 实战分析

本文通过分析一个完整的项目,来学习如果对一个完整的工程比较好的进行编写测试程序

项目地址 ,该项目采用的是 mvp 架构,(关于 mvp 的介绍可以看这里 ),mvp 对于测试的好处就是讲 view 逻辑和业务代码分离,我们可以很方便的对业务代码进行 local unit test 的测试。

项目结构

可以看到项目的整体结构比较清晰

  1. 项目代码
  2. Android 测试(Instrumentation test)
  3. Android 测试 相关 mock
  4. local unit test
  5. local unit test 相关 mock
Read more   2016/11/13 posted in  Android

Android 测试 (五)-- 实战分析

通过一个邮箱的开源项目分析如果对一个项目进行 android 测试。

项目地址我在文章http://xuyushi.github.io/2016/06/18/Android%20APP%20%E6%96%B0%E6%A1%86%E6%9E%B6/ )中已经对这个项目的框架进行了解析,不熟悉的可以看这里

改项目采用的是 Rxjava + retrofit + dagger2 + mvp 的框架。测试采用的是 unit + dagger + robolectric ,unit test 测试 mvp 中 P层的依赖

2016/11/13 posted in  Android

Android 测试 (三)--Local Unit Tests

如果你的单测程序没有或者只有少量的 Android 依赖,你应该在你的本地开发环境中运行你的测试程序。因为这种方法可以避免每次将测试代码加载到物理设备或者模拟器上运行,所以测试效率比较高。执行单元测试的时间大大减少。你可以使用 mock 框架比如 Mockito 来解决一些依赖关系

Read more   2016/11/6 posted in  Android

Android 测试 (二)--Instrumented Unit

Instrumented 单元测试运行在物理设备或者模拟器上。他能使用 Android api 和一些 support api,例如 Android Testing Support Library。如果需要获取 instrumentation 信息(例如需要 app 的 context)或者需要 Android 框架里的一些组件(比如 Parcelable 或 SharedPreferences 对象),可以使用Instrumented 单测

使用Instrumented单元测试也有助于减少编写和维护mock 代码的工作量。如果你选择mock 的话,可以使用一个模仿的框架来mock 任何依赖关系。

Read more   2016/11/5 posted in  Android

Android 测试 (一)--测试总览

android 测试基于 Junit,我们既可以在 JVM 运行单元测试,也可以在 Android 设备上运行功能测试

测试类型

当使用 Android studio 来写测试程序时,你的代码必须放在两个指定的文件夹中。

Local unit testsWARNING: No manifest file found at ./AndroidManifest.xml.

Falling back to the Android OS resources only.
To remove this warning, annotate your test class with @Config(manifest=Config.NONE).
位于 module-name/src/test/java/.
这些测试时运行在本地 JVM,没有运行 Android framework API的权限

Read more   2016/11/5 posted in  Android

HashMap 的实现原理

HashMap 概述

HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高或将加载因子设置得太低。也许大家开始对这段话有一点不太懂,不过不用担心,当你读完这篇文章后,就能深切理解这其中的含义了。

需要注意的是:Hashmap 不是同步的,如果多个线程同时访问一个 HashMap,而其中至少一个线程从结构上(指添加或者删除一个或多个映射关系的任何操作)修改了,则必须保持外部同步,以防止对映射进行意外的非同步访问。

Read more   2016/10/16 posted in  Java

hashcode

官方规定

hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。

hashCode 的常规协定是:

在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。

以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

Read more   2016/10/16 posted in  Java