自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

RickyXE

宁静致远

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

原创 JNI入门教程:最小环境HelloWorld实战

JNI是Android应用开发中不太常涉及的技术,但在Framework层中却被广泛使用。作为一名Android应用开发人员,学习JNI知识,对理解整个系统原理还是有很大帮助的。学习JNI有很多途径:可以直接阅读Framework源码。这种方案不太好上手验证,因为Framework代码要配置的编译环境还是比较复杂的,而且编译后没法直接运行测试,需要Root系统其次也可以下载安装NDK,直接在Android Studio里开发项目。这种方式也有比较多的环境配置工作,并且操作起来比较麻烦。因此这篇文

2020-05-26 17:54:45 446

原创 Android中使用Kotlin协程代替RxJava封装网络请求

现在的Android项目普遍使用Retrofit+RxJava的组合实现网络接口请求与数据的展现。这一功能通过Kotlin语言的协程功能也可以很方便的实现。相比较而言,RxJava功能过于强大,如果仅用于封装网络请求,有些杀鸡用牛刀的感觉。使用Kotlin的协程实现这个需求代码更精简,逻辑也更清晰一些。以下是一个完整的例子。使用Retrofit结合Kotlin协程,实现网络请求。点击Acti...

2019-06-10 18:41:55 9494 3

原创 Java中实现自定义的注解处理器(Annotation Processor)

在之前的《简单实现ButterKnife的注解功能》中,使用了运行时的注解实现了通过编写注解绑定View与xml。由于运行时注解需要在Activity初始化中进行绑定操作,调用了大量反射相关代码,在界面复杂的情况下,使用这种方法就会严重影响Activity初始化效率。而ButterKnife使用了更高效的方式——Annotation Processor来完成这一工作。Annotation Pr

2016-07-25 19:42:49 21591 6

原创 Gradle仓库配置

Android Studio使用Gradle构建app。Gradle的使用非常灵活,其中可以设置使用多种类型的仓库,来获取应用中使用的库文件。 支持的类型有如下几种: 类型 说明 Maven central repository 这是Maven的中央仓库,无需配置,直接声明就可以使用。但不支持https协议访问 Maven JCenter repository JCenter

2016-07-18 17:30:42 37571 1

原创 Java中的枚举与values()方法

Java枚举中的values()方法在编写Java程序时经常会用到枚举类型,今天我们就来看一下枚举中常用到的values()方法。首先,我们在Eclipse中编写一个简单的类:public class EnumTest { private enum Directions { NORTH, SOUTH, EAST, WEST }}在这里,我们定义

2015-09-24 11:10:47 39032 10

原创 JNI学习:在Java中保存Native对象引用

在学习Android Framework源码时,发现部分类中声明了这个变量:private int mPtr; // used by native code那么native层是怎么使用这个变量的呢?以Framework中的MessageQueue为例,它的Native模块源码为/frameworks/base/core/jni/android_os_MessageQueue.cpp查看其中的代码,可以发现这几个调用:// Java 层的MessageQueue构造函数中,会调用Native中的这

2020-05-29 15:51:47 1236

原创 在Idea Community版中远程调试Tomcat Web工程

最近将开发的项目从Eclipse迁移到了IDEA社区版,虽然写代码爽快不少,但还是缺少一些Eclipse中的常用功能。因此考虑将两者结合起来使用:通过IDEA开发项目代码利用Eclipse中的Server插件部署Tomcat,开启远程调试通过IDEA连接调试端口,进行远程调试网上大部分有关Tomcat远程调试的文章,都是修改Tomcat启动文件。这个改动在Eclipse中也可以很方便的...

2019-05-30 17:32:41 1507

原创 使用Node.js+Express搭建App开发调试Server

在开发手机端App时,通常会出现移动端新页面开发的差不多了,后台接口还没Ready,导致前后端联调浪费了大量时间。 联调过程中又往往涉及到测试服务的切换、抓包验证以及测试异常数据等测试。进而涉及到App重新打包,配置Charles等抓包工具,后台改数据等等工作,非常麻烦。今天就使用Node.js实现一个用来调试的server,简化这些调试工作。这个server涉及到以下几个功能: 1. ...

2018-05-22 20:13:18 4261

原创 升级Retrofit2遇到的POST请求中Content-Type字段问题

最近将项目中的Retrofit由1.9升级到2.3版本。 在没有更改请求配置的情况下,发现请求头的Content-Type不一样了。通过抓包查看请求, 1.9版本POST请求的Header字段Content-Type:application/x-www-form-urlencoded; charset=utf-82.3版本POST请求Header字段Content-Ty...

2018-04-04 11:17:04 19498 1

原创 Kotlin中的构造函数

假设有个Person类,含有两个属性name和age先看一个Java版本public class PersonJava { private final String mName; private final int mAge; public PersonJava(String name) { this.mName = name; this.mAg

2017-11-14 17:03:02 11938

原创 Java获得范型类型class

Java很多框架或库中都会提供具有范型的回调接口或抽象类。当我们在使用时,代码类似于:MyClient.getInstance().handleEvent(new MyCallback<SomeEntity>() { @Override public void onSuccess(SomeEntity entity) {

2017-09-14 12:50:44 2204

原创 Python访问https报错CERTIFICATE_VERIFY_FAILED

在Mac上安装了Python 3.6版本,使用urllib库访问网页却返回了ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)这样的错误。这是由于MacOS版本的python 3.6版本没有使用系统的openssl进行证书验证。在/Applications/Python\ 3.6/

2017-08-23 11:03:54 8833 3

原创 Java中的动态代理

在实际的项目开发中,会大量的用到代理模式。这一设计模式又与面向切面编程(AOP)紧密相关。 Java中可以通过静态代理或动态代理两种方式实现代理模式。其中静态代理容易理解,但由于需要编写大量代理类及代理方法代码,非常不利于维护;而动态代理的代理类在运行时生成,也不用编写大量重复性代码,相比静态代理有很大的优势。动态代理涉及一个重要的接口InvocationHandler以及一个重要的类Proxy,

2017-05-03 19:05:53 515

原创 Android通讯录的管理(联系人的增删改查)

Android中的联系人存储是通过ContentProvider实现的。因此APP对系统通讯录进行操作涉及到ContentProvider接口的使用。通讯录存储常用的数据库表使用有关接口前,首先了解一下通讯录数据库中常用的数据库表: 表名 表用途 contacts 联系人表,存储了实际的联系人姓名,头像,最后通话时间等信息。\n会对实际的联系人数据进行一定去重。 raw_

2017-03-01 17:25:07 21292 1

原创 Handler发送消息后消息队列的处理

在Android中使用Handler不仅可以直接post发送消息,还可以通过postDelayed设定延迟时间,来延迟执行消息任务。那么这后面的机制是如何处理的呢?首先查看Handler的源码,会发现post和postDelayed内部均调用的同一方法sendMessageDelayed:public final boolean post(Runnable r){ return sendM

2017-02-09 18:21:52 3944

原创 Javascript中的闭包及应用

闭包是JavaScript比较有意思的特性,也是比较难搞懂的一个概念。一个比较典型的例子就是打印循环计数—— 首先我们写一个小循环,直接打印循环变量ifunction testA() { for(var i = 0; i < 10; i++) { console.log("current: " + i); }};这个程序的输出很简单current: 0curre

2017-02-07 00:23:27 424

原创 将异步API改成同步调用

有时候为了满足需求,我们需要在自己的类中进行线程管理/开启线程,并回调我们自己封装好的回调方法。例如:public void someTask() { new Thread() { @Override public void run() { int n = yourObject.someApi(); onGetR

2017-01-16 01:02:13 8070

原创 Activity启动流程

1.自定义的Actitiy类初始化工作在onCreate中 2.onCreate是回调函数,在Activity抽象类中应有直接调用的地方 3.查找Activity源码,在performCreate(5230行)处 4.查找framework源码,发现Activity的performCreate函数是在Instrumentation类中callActivityOnCreate函数中被调用 5.

2016-10-29 14:52:04 876

原创 二分查找

public class BinarySearch { // 二分查找的前提是所查找的数组已经有序。在查找过程中, // 每次取出中间的元素,与目标数值比较,若相等则直接返回; // 若不等,则根据排序规则在一侧中继续查找,直到这一侧元素仅剩一个时, // 若与目标元素相等,则直接返回;否则表明数组中没有待查找元素。 public static int bina

2016-10-13 00:25:25 483

原创 Java中的ReentrantLock

Java中的ReentrantLock基本功能与synchronized代码块相当,但是提供了一些高级特性。首先来看一下ReentrantLock的基本使用:public class LockTest { ReentrantLock mLock = new ReentrantLock(); int num = 0; Runnable mRunnableOne = new Runna

2016-10-05 18:50:38 422

原创 Java线程中的wait(),notify()与sleep()

在Java中可以通过wait()与notify()或notifyAll()实现线程协作。简要总结有如下几点: 1.wait()让线程进入等待状态,并释放锁(而sleep等待的同时并不释放锁) 2.notify()通知wait的线程尝试获取对象锁,在此线程任务执行完后,wait的线程就会重新获得锁,继续运行。 3.wait与notify均是Object的方法,调用这两个方法需要在synchron

2016-09-28 00:33:08 666

原创 Android中使用加速度传感器

在Android中使用加速度传感器可以帮助我们识别手机的姿态及运动状态。 使用加速度传感器与其他传感器的方法大致相同,通过调用系统API就可以实现。分为以下几步: 1.获取SensorManager 2.使用SensorManager获取加速度传感器 3.创建自定义的传感器监听函数,并注册 4.相对应的,在合适位置实现注销监听器的调用简单的代码如下:public class MainAct

2016-09-22 01:25:23 18167

原创 okhttp异常: java.lang.IllegalStateException: closed

09-05 14:42:17.606: E/AndroidRuntime(28219): Caused by: java.lang.IllegalStateException: closed09-05 14:42:17.606: E/AndroidRuntime(28219): at okhttp3.internal.http.Http1xStream$ChunkedSource.read

2016-09-06 18:14:50 21001 12

原创 ListView中的局部刷新

在列表中显示多个下载进度条是一个很常见的需求了, 这个需求主要涉及到以下两个技术点: 1.Handler异步更新UI 2.ListView进行局部更新今天来看一下这一功能最简单的实现——模仿多个APP下载更新进度条。 为了让代码简单一些,在这里使用了ListView显示列表,直接使用线程控制进度更新。首先,来创建一个AppItem的类在ListView中显示项目:public class A

2016-08-31 19:33:12 2138

原创 Android SDK中的自动化测试

Android中的测试手段非常丰富,通常上,按测试运行环境来划分,可以分为本地单元测试与Instrument测试: 运行环境 测试类型 PC机 本地Unit Test Android手机或模拟器 Instrument Test这两种类型测试源码在工程的位置分别为: 测试类型 对应目录 本地Unit Test mod

2016-08-11 18:14:26 6690

原创 iOS中异步回调的单元测试方法

在XCode6以上版本中,苹果添加了用于异步回调测试的api,因此不用像旧版本那样,发起异步调用后通过循环查询标志位,来检查异步回调函数的调用了。 在新版本中直接使用XCTestExpectation的API即可实现这一功能。首先来看一下官方文档中的代码片段:- (void)testDocumentOpening{ // 创建一个expectation对象 XCTestExpec

2016-08-11 14:33:37 5762

原创 Android中的IPC——AIDL方式

AIDL是实现Android中IPC的一种方式。 通过AIDL我们将各种通信操作以接口方式进行定位,Android SDK则会按照AIDL的规则将AIDL编码成java类嵌入到应用中,然后我们就可以在APP运行时以调用函数的形式来进行IPC了。实际Messenger进行IPC本质也是以AIDL方式实现的,只不过通过上层接口封装我们不用自己实现AIDL的接口定义。Messenger与AIDL的

2016-08-09 22:35:11 629

原创 归并排序

归并排序的步骤就是分组->合并,这两步均是递归进行,直到所操作的子组仅有一个元素为止。例如一个数组:6, 3, 1, 9, 2, 7, 4, 5首先分成两组:[6, 3, 1, 9] [2, 7, 4, 5]对于左边,再次分组:[6, 3] [1, 9]再对左边分组:[6] [3]因为各自仅包含一个元素了,这一个元素组成的字数组就是有序的了。接下来向上递归合并:[6] [3] -> [3, 6][

2016-08-06 14:31:00 411

原创 快速排序

快速排序的思路是选定一个标志元素,将比这个元素小的所有元素放在一边,比其大的放在另外一边。然后发分别对两个子数组进行同样的操作,直到子数组元素数为1时,整体数组就排好序了。

2016-08-04 00:22:58 268

原创 Android.mk学习笔记

LOCAL_PATH := $(call my-dir)这条语句出现在Android.mk最开始。由于我们将所有源码等文件都存在了当前目录或子目录,因此调用my-dir这个函数来告知编译器所编译的模块在mk所在当前目录下。LOCAL_MODULE这个参数是模块的名称,要求全局唯一并且不能带空格。 可以简单试验一下,找到任意一个模块的目录,例如device/generic/goldfish,这是虚拟

2016-08-02 19:05:19 2398

原创 MacOS下编译Android源码报错:Can not find SDK 10.6 at

Can not find SDK 10.6 at /Developer/SDKs/MacOSX10.6.sdk这个问题出错的log如下:android-4.4.4_r2.0.1 carl$ lunch aosp_x86-engbuild/core/combo/mac_version.mk:38: ***************************************************

2016-08-02 14:48:28 7115

原创 Fragment与Activity交互--Handler方式

Fragment与Activity交互有很多种实现方式。其中一种常用方法是通过Handler消息处理实现。那么在谁的类中实现Handler呢?规则很简单: 谁想被控制,就在谁的类中实现Handler。在另一方中得到这个Handler对象,来实现单向交互。例如很典型的应用场景: Activity需要响应返回键事件,并改变Fragment中状态。那么Fragment就是被控对象, 需要在Fragm

2016-08-02 01:10:45 1957

原创 Service Intent must be explicit错误

在Android 5.0以上版本,Intent必须声明为显式,否则会报Service Intent must be explicit错误,解决的方法很简单,在Intent中设定需要响应此Intent的包信息就可以了:Intent intent = new Intent();intent.setAction("YOUR_ACTION");intent.setPackage("TargetPacka

2016-07-20 11:01:00 377

原创 冒泡排序

冒泡排序的思路很简单——从头至尾遍历数组元素,若前一项大于(或小于)后一项,则交换相邻两项。单次遍历整个数组可将某一个元素排列到正确位置,因此需要遍历元素数量n次。在代码中体现也就是内外两层循环,内层循环负责遍历中两两元素的交换操作,外层负责遍历次数控制。首先看版本1:/** * 冒泡排序效率最低写法,没有任何优化步骤 * @param arrayToSort */public static

2016-07-17 16:10:38 358

原创 Docker学习笔记

最近学习了一下Docker。 原本是想在Mac上搭建一个网页服务器,用homebrew装了一些需要的软件包,但发现配置起来还是比linux麻烦一些;但又不想装类似virtualbox这样的虚拟机,下载镜像安装一遍也挺麻烦,而且virtualbox相对比较重。最后就找到了Docker。首先在Mac下安装Docker已经很简单了,Docker官方提供了Mac下的原生程序。和以前的Boot2Docker

2016-07-17 10:56:56 654

原创 向量的施密特正交化

标准的定义引自Wiki We define the projection operator by proju(v)=⟨v,u⟩⟨u,u⟩uproj_u(v) = \frac{ \langle v,u\rangle }{\langle u, u \rangle}u where ⟨v,u⟩\langle v, u \rangle denotes the inner product

2016-07-13 18:17:06 13088 1

原创 Android Studio中的多渠道包开发

今天来看一下Android Studio中的多渠道打包功能。主要应用到了Gradle中的Product Flavors配置。首先建立一个普通的APP工程。创建好后默认的结构如下: 可以看到默认包含main这一主干版本。 接下来加入我们向发布一个Foo的渠道版本,需要对工程进行配置。 结合网上查到的资料和我的实践,简要来说有以下几个注意点:1.最新的Android Studio已经可以通过图形

2016-07-05 15:00:26 3207 3

原创 Android Studio导出jar包

首先来看一下Android Studio默认Project中的app module,以及可创建的Android Library以及Java Library两种module的差异: module gradle plugin 生成文件格式 是否可使用SDK API app com.android.application apk 可以使用 Android Library

2016-07-04 14:10:57 1593

原创 Android Studio中的单元测试

在最新版Android Studio(2.1)中,已经可以方便的使用Mockito进行含有android api的单元测试了。因此可以更好的进行敏捷开发与持续集成测试。创建单元测试在Android Studio中新建工程,目录结构如下图显示: 其中 androidTest目录是Instrumentation Test的工程代码 main即App工程代码 test就是单元测试工程代码。编写

2016-06-30 11:46:58 5911

原创 onTouchListener中的onTouch函数

今天来研究一下onTouch函数的返回值。首先在一个ImageView中添加一个监听器:mImageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.i(TAG, "o

2016-06-28 17:41:19 3105

空空如也

空空如也

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

TA关注的人

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