自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 资源 (2)
  • 收藏
  • 关注

原创 Android Stuido 使用cMake构建NDK项目

Android Stuido 使用cMake构建NDK项目

2017-01-03 10:58:08 1031

原创 Java同步容器与并发容器

Java容器Java提供了很多容器类,方便用户使用。关键接口图如下(图片来源自The Java™ Tutorials), Collection——集合框架结构的根节点。Java并没有提供该接口的具体实现,但是提供了Collection子接口,比如Set,List的具体实现。本篇博客大纲,1. 介绍java 容器类2. 介绍Java同步容器类,并介绍其可能出现的问题2. 简单介绍下Java并发容器

2016-08-29 18:15:03 837

原创 Java并发编程番外篇(三)volatile变量、happens-before与内存一致性错误

Java并发编程番外篇(三)volatile变量、happens-before与内存一致性错误volatile变量volatile是Java的关键词,我们可以用它来修饰变量或者方法。为什么要使用volatilevolatile的典型用法是,当多个线程共享变量,且我们要避免由于内存缓冲变量导致的内存一致性(Memory Consistency Errors)错误时。考虑以下的生产者消费者例子,在一个时

2016-08-22 23:08:48 1625 1

原创 Java并发编程番外篇(二)happens-before关系

在Java 并发编程(三)同步中,提到了内存一致性错误,而避免内存一致性错误的关键就是了解happens-before关系。那么什么是happens-before关系呢?如何判断两个操作是否存在happends-before关系呢?本文将来介绍这两个方面。1. happens-before关系Wikipedia, Happened-before是这样定义的: In computer scienc

2016-08-21 23:01:48 2894 2

原创 Android多进程使用及其带来的问题

本文介绍Android程序如何使用多线程,为什么要使用多进程,并说明了使用多进程可能会出现的一些问题。1. Android程序如何使用多进程根据Processes and Threads,默认情况下,一个Android程序的所有组件都是在一个进程中执行的,该进程的名字就是程序的包名。同时,Android也允许开发者将程序的一些组件在其他进程中执行。四大组件均支持android:process属性,我

2016-08-21 16:46:15 5184

翻译 Java并发编程(七)高级别并发对象

7. 高级别并发对象到目前为止,本课程介绍了一些Java平台初学者必须的低级别API。在本节,我们将要介绍Java平台5.0引入的一些高级别并发特性。包括Lock,Executors,并发集合,原子变量和ThreadLocalRandom等知识。

2016-08-20 15:25:53 2113

翻译 Java并发编程(六)不可改变对象

6. 不可改变对象如果一个对象在创建后不可改变,那么就称之为不可改变对象。基于不可变对象被广泛接受为创建简单、可靠代码的有效策略。不可变对象在并发程序中显得尤为重要。由于它们不能改变,所以他们不会在线程干扰中出现错误,并且不会出现非一致性状态。开发者并不太原因使用不可变对象,他们担心创建对象的开销比更新一个现有对象的开销大。创建对象的开销经常被夸大,并且可以被不可变对象带来的效率弥补。这包括由于垃圾

2016-08-16 10:06:02 2875

翻译 Java并发编程(五)保护块

5. 保护块线程通常需要协调任务。最常用的协调方法是保护块(guarded block)。这样一个块以一个条件开始,如果该条件为真,则该块的代码得以执行。这样做需要遵循一些步骤。假设,guardedJoy是一个方法,该方法不会执行直到另一个线程设置joy变量的值。理论上,这样的方法可以简单地循环直到条件符合。然而,循环是浪费资源的,因为当等待的时候,它也继续执行。public void guarde

2016-08-15 21:28:28 515

翻译 Java并发编程(四)活跃度

4. 活跃度一个并发应用及时执行的能力称作活跃度。本节介绍最常见的活跃度问题,死锁,然后继续简单介绍两种其他的活跃度问题,饥饿和活锁。4.1 死锁死锁介绍了两个或者多个线程永远阻塞、彼此等待的情形。这是一个例子, Alphonse和Gaston是朋友,并且彼此很有礼貌。一个礼貌的严格规定是,当你鞠躬的时候,你必须保持一直鞠躬,直到你朋友结束鞠躬。然而,这却没有考虑两个朋友可能在相同时刻都向对方鞠躬

2016-08-15 12:07:38 1127

翻译 Java并发编程(三)同步

Java并发编程(三)同步3. 同步线程主要通过共享内存(成员变量)来进行通信。这种形式的交流很有效率,但是可能会导致两种错误:线程接口和内存一致性错误。预防这些错误的方式就是同步。本文介绍线程干扰、内存一致性错误、同步化方法、隐式锁和同步、原子操作等内容。

2016-08-15 10:21:04 598

原创 Java并发编程番外篇(一)如何结束一个线程

本篇博客介绍下如何结束一个线程。在Java 的设计中,当一个线程的run方法中代码执行结束后,该线程就自动结束了。但是,在我们的实际开发过程中,可能会需要手动的结束一个线程,此时我们应该怎么安全地结束一个线程呢?1. stop方法根据Java的官方文档,Java Thread,该方法已被弃用。文档给出的解释是,该方法不安全,使用stop方法结束一个线程会导致该线程释放所有占有的锁。如果这些锁保护的一

2016-08-12 08:37:00 1935

翻译 Java并发编程(二)多线程编程

在上一节,我们介绍了进程与线程的概念,接下来介绍如何使用多线程(暂不介绍多进程)。Thread对象每个线程都对应一个Thread实例,存在两种策略使用Thread类来创建并发程序。直接进行线程的创建和管理,也就是当需要开启一个异步任务时,实例化一个Thread对象。抽象线程管理,将执行任务交给执行器。本节介绍如何使用Thread类。定义和执行新的线程在创建新线程的时候,我们需要指定该线程运行的

2016-08-10 17:38:38 639

翻译 Java 并发编程(一)进程与线程

本篇博客介绍下进程与线程的区别。 在现有的并发编程中,有两个重要的执行单元:进程与线程。在Java变成语言中,与并发编程相关的通常是线程。然而,进程也同样重要。一个计算机系统通常会有许多的活动进程和线程。即使当系统只有一个执行内核时(也就是在一个给定的时间,只有一个线程在运行),该系统也支持多个进程与线程。单一内核的执行时间被进程和线程共享,该特性我们称之为时间片(time slicing)。计算

2016-08-10 16:17:41 388

原创 Android自定义权限与使用

本篇博客介绍下Android开发者如何自定义权限,进而如何将自己的部分组件暴露。并介绍客户端如何调用这些暴露的组件。1. 如何自定义权限Android允许我们使用permission标签,在Manifest文件中定义属于自己的权限,一个例子如下,<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas

2016-07-16 15:14:24 12288 3

原创 Android文件存储方式

Android文件存储方式 做过Android开发的都知道,Android将文件空间分为两部分,一部分是外部空间,一部分是内部空间。内部空间有以下特征:它始终可用。 默认情况下只有您的应用可以访问此处保存的文件。 当用户卸载您的应用时,系统会从内部存储中删除您的应用的所有文件。

2016-06-27 14:24:10 506

原创 Nexus 5x 使用TWRP 刷root包

本篇介绍在Nexus 5x上如何使用TWRP刷SuperSU来获取手机的root权限。 测试手机,Nexus 5x,Android版本6.0.TWRP安装TWRP,全称是TeamWin Recovery Project,可以用来刷机,备份Android手机。 我们可以从该网址TWRP下载合适自己机型的TWRP。搜索到自己机型后,我们会进入到一个说明界面。我们可以看到,TWRP提供了几种方式来安装

2016-06-26 21:34:45 6918

原创 Android 从任何地方得到Application context

本篇文章介绍如何得到在程序的任意地方得到Application context。1. 继承Application类,在内部保存application context;2. getApplication或getApplicationContext;3. 反射得到Application context

2016-05-27 11:22:32 11515

原创 Android JNI Java类型签名

Android Java 类型签名。JNI提供了Java和native代码相互交互的接口,当我们在底层访问Java类的域(成员变量)或者方法时,需要提供域或者方法描述符,比如,下面代码,

2016-05-24 16:04:47 4080

原创 Android Java对象和底层结构体转换

JNI提供了Java和native代码相互调用的接口,注意是相互调用,不仅仅是Java可以调用native,native也是可以调用Java的。但是使用的时候,我们会遇到一些问题,本文介绍一下Java对象和底层结构体的转换。Java 对象我们有Person类,public class Person { public int ID; public String name; pu

2016-05-24 15:02:42 4522

原创 Android 如何调用第三方.so (.a) 文件

在ndk开发中,我们有时候会使用到别人编译好的第三方本地库,这些本地类库有时候是符合JNI接口的,同时可能会提供一些Java接口文件,这样我们就可以直接将.so文件和Java文件直接导入。但是有时候,可能一些本地类库并不符合JNI接口,而且,其并没有提供Java层,这个时候,我们就需要自己编译本地类库啦。本文,我们将对这两种情况进行说明。1. 本地类库符合JNI接口大多数本地类库都是符合这种情况的,

2016-05-18 11:24:09 16174

原创 Java HashMap学习

做过Java或者Android开发的肯定使用过HashMap。最基本的就是HashMap维护了一个key, value表,可以实现数据的快速存储和读取。本篇文章就来揭开HashMap的面纱,从其源码来回答如下问题, 1. HashMap如何实现快速存储?其数据结构是什么? 2. HashMap的长度是固定的么? 3. HashMap的key是自定义对象时,有什么需要注意的?equal和hash

2016-05-16 09:21:18 510

原创 Android Callable Future FutureTask学习

本篇博客介绍了Android Callable、Future、FutureTask的概念,并给出了一些例子。

2016-03-13 16:37:25 899

原创 Android 线程与线程池 Thread&ThreadPool

1. 线程Thread学过计算机的人都知道,什么是Thread。对于计算机来说,Thread是最小的执行单元。做过Android开发的人都知道,我们开发的App至少存在一个线程,那就是主线程。那么如果我们想要执行耗时的任务的话,我们是不能在主线程做的,因为这样会引起ANR。此时,我们就要开启一个新的线程来做我们的任务,我们可以称之为工作线程。1.1 开启新的线程那么,我们应该如何在新线程中执行自己的

2016-03-12 18:23:51 818

原创 Android startservice & bindservice的区别

Android startservice & bindservice的区别作为一个android开发者,service大家应该已经接触过了,接触Android的第一节课,就是将Android的四大组件,那么作为四大组件之一的service,你是否足够了解呢?service和thread的区别你是否知道?service真的能执行长时间的后台操作么?你是否知道startservice和bindser

2016-01-16 21:10:09 2287 1

原创 Android permission 动态申请、授权

Android permission 新特性深度学习本篇文章介绍android permission系统,并介绍android 6.0 permission的新特性,包括权限动态申请和授权等。permission systemAndroid开发者都知道,我们开发的应用默认是没有任何权限的,我们没有办法联网,没有办法进行外部空间存储(内部空间是可以的),除非我们申请了相应的权限(permission

2016-01-12 21:36:16 5950

原创 Android MVP 学习

Android MVP 学习我们都听说过MVC,但是MVP是什么鬼呢?MVP概念M对应Model,V对应View,P对应Presenter。MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间

2016-01-12 18:19:28 788

原创 Effective Java之总是要改写toString

Effective Java之总是要改写toString

2015-12-07 21:07:04 659

原创 Effective Java之改写equals时总要改写hashCode

改写equals时总要改写hashCodehashCode,就是哈希值,可以理解为一个对象的标识(好的hash,能确保不同的对象有不同的hash值),Object含有hashCode方法,用来返回对象的hash值。hashCode方法多用在基于散列值的集合类,比如HashMap、HashSet和Hashtable。下面是hashCode的约束规范, 在一个应用程序执行期间,如果一个对象的equa

2015-11-27 19:59:14 1475

原创 Effective Java笔记之改写equals的通用约定

改写equals的通用约定我们知道,在java的世界里,所有的类都是Object的派生类,其实Java设计Object的缘由就是为了扩展,它的所有非fina方法,包括equals、hashCode、toString和finalize都有明确的通用约定。任何一个改写这些方法的时候,都得遵守这些约定。改写equals方法看起来非常简单,但是许多改写的方式会导致错误,而且后果很严重。要避免问题最简单的方法

2015-11-27 11:29:30 578

原创 Java私有构造函数的使用

本篇文章介绍下Java,私有构造函数的使用。Java私有构造函数的使用当我们学习Java的时候,我们接触到的构造函数的权限修饰符都是public,比如,public class Test { public Test() { } }}我们,知道构造函数的用途是创建一个对象,并返回。比如,Test instance = new Test();如果你很了解java的权限修饰符的话(

2015-11-26 21:02:03 15357 6

原创 Android 使用NDK编译二进制文件并运行

Android 使用NDK编译二进制文件并运行本文介绍如何编译可以在Android平台上运行的二进制可执行文件。 首先我们,知道,Android是基于Linux的,而在Linux上,可以执行二进制文件,那么如何在Android上执行二进制文件呢?使用NDK编译如果你已经下载了NDK,并且将其添加进环境变量,可以这样编译二进制文件。首先新建一个HelloWorld文件夹,在其内部建立一个子文件夹jn

2015-11-19 11:14:19 8489 4

原创 Android 你不知道的Service(服务) & Thread(线程)

Service作为Android的四大组件之一,你或许会经常用它。当提到它时,我们都随口说,它会在后台执行长时间的任务,但是,这种表述真的对么?你是否真的了解Service,就让我们来揭开Service的真面目。ServiceAndroid Developer对于Service如下定义, A Service is an application component that can perform

2015-11-18 15:05:49 12515 2

原创 Java 设计模式之单例模式详解

本文学习一个Java单例模式。单例模式单例,顾名思义,就是只存在一个实例。或许,你也会疑问?为什么会使用到单例模式呢?这是因为,很多情况下,我们需要一个实例,比如线程池、缓存、驱动等,如果存在多个实例,那将会导致混乱。首先我们复习下构造函数,构造函数构造函数的用处是实例化对象, 我们的用法通常是这样,public class ClassA { public ClassA() { }

2015-11-14 20:58:23 666

原创 Java 多态 后链接(late binding)与前链接(early binding) 向上转型(upcast)

使用过面向对象编程(OPP)的都知道,多态是OPP的一个主要特性之一。Java做为一种OPP语言,其也有多态特性。 那么什么是多态呢?多态指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

2015-11-13 12:19:30 2748 1

原创 Java 虚拟调用(virtual invoke)分析

此文章来分析下,Java 的虚拟调用 When we say Java language has virtual method calling we mean that in java applications the executed method is determined by the object type in run time. Java的虚拟方法调用,指的是,调用的方法是由对象运

2015-11-13 09:21:46 1670 1

原创 Android 动态加载之DexClassLoader

Android提供动态加载机制,允许从SD卡中加载dex格式的文件,其中,DexClassLoader类起了关键作用。首先看下Android Developer关于DexClassLoader的介绍,    A class loader that loads classes from .jar and .apk files containing a classes.dex entr

2015-11-08 09:11:10 3479

原创 浅谈Android Service与IntentService的区别

service大家估计比较清楚了,是Android 的四大组件之一,如果你不了解,请百度Android四大组件。至于什么是IntentService,估计很多人都很陌生,笔者也是,最近在做一个项目,于是接触到了Intentservcie,于是写下来与大家分享下我的经验与收获。官方给出IntentService的解释是,An abstract Service that

2015-03-15 18:58:37 1084

原创 Android 屏幕点击手势判断

近期在做一个项目,其中涉及到屏幕点击事件的手势判断,比如是单击还是双击,是左滑还是上滑等。要获取到屏幕的点击事件并不难,只需要重载Acivity的onTouchevent(MotionEvent ev)方法,或者dispatchTouchEvent(MotionEvent ev)方法即可,其中传入的形参MotionEvent ev,ev即为点击事件,我们可以获取到ev,然后得到点击事件

2015-03-14 21:27:05 1677

Understanding the Linux Kernel 3rd Edition

英文版,详细介绍了Linux内核。经典之作,值得收藏。

2015-11-16

Android动态加载之DexClassLoader学习

DexClassLoader学习源码,使用时,请删除Lib.Java文件,否则会出现loadClass错误。

2015-11-08

空空如也

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

TA关注的人

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