- 博客(58)
- 收藏
- 关注
原创 AbstractQueuedSynchronizer框架浅析
AbstractQueuedSynchronizer框架浅析1.概述AbstractQueuedSynchronizer(AQS)抽象类提供一个实现阻塞锁和依赖于FIFO等待队列的同步器的框架。 AQS被设计用来作为众多同步器的基类,例如ReentrantLock、Semaphore、CountDownLatch、FutureTask以及ReentrantReadWriteLock。AQS依赖于一
2017-12-23 15:58:31 623
原创 JobScheduler简介
JobScheduler机制简析1.概述JobScheduler主要用于在未来某个时间下满足一定条件时触发执行某项任务的情况,那么可以创建一个JobService的子类,重写其onStartJob()方法来实现这个功能。JobScheduler提供了接口来调度各种类型的工作,在应用进程中执行。JobInfo里面包含了很多关于工作的信息,可以将JobInfo传递给JobScheduler的schedu
2017-12-09 15:52:15 15383
原创 LeakCanary
LeakCanary原理浅析1.LeakCanary简介LeakCanary是一个Android和Java的内存泄漏检测库,可以大幅可以大幅度减少了开发中遇到的OOM问题。LeakCanary开源库的地址为:LeakCanary开源库LeakCanary的README地址如下:LeakCanary的README2.如何使用LeakCanary使用LeakCanary非常简单,只需要在Applicat
2017-11-27 21:51:44 1123
原创 Java异常
Java异常Java异常概述基本异常捕获异常1 try块2 异常处理程序创建自定义的异常异常说明捕获所有异常1 栈轨迹2 重新抛出异常3 异常链Java标准异常使用finally进行清理异常丢失异常的限制构造器异常匹配throw和throws有什么区别Java中Exception和Error有什么区别Java异常类介绍Throwable类Exceptio
2017-10-24 20:50:06 1515
原创 HashMap之快速失败
HashMap之快速失败为什么HashMap通过迭代器自身的remove或add方法就不会出现迭代器失败?HashMap所有集合类视图所返回迭代器都是快速失败(fast-fail)的。 在HashMap中,有一个变量modCount来指示集合被修改的次数。在创建Iterator迭代器的时候,会给这个变量赋值给expectedModCount。当集合方法修改集合元素时,例如集合的remove()方
2017-10-23 00:04:23 2668
原创 Map集合
Map集合Map集合简介映射表的性能1 散列码2 性能因子Map集合的一些实现1Map2AbstractMap3 HashMap4 LinkedHashMap5 TreeMap6 SortedMap对Map的选择Map集合的框架图1.简介映射表(也称关联数组)的基本思想是它维护的是键-值(对)关联,因此你可以使用键来查找值。标准的Java类库中包含了Map的几种基本实现
2017-10-22 23:24:18 445
原创 智能指针
智能指针智能指针简介强指针sp弱指针wp重要函数实现总结1.简介1.指针问题的常见来源:指针没有初始化new了对象后没有及时delete,导致内存泄漏。野指针;使用delete后的对象,会导致系统崩溃。通过delete释放了对象,但没有将指针置空。2.如何设计一个智能指针考虑的因素:初始化;实现new和delete的配套;具体的设计实现:我们将智能指针称为SmartPoi
2017-10-09 21:24:00 425
原创 输入事件ANR原理分析
输入事件ANR原理分析输入事件ANR原理分析简介源码分析总结1.简介当输入事件长时间未响应,则会发生ANR。输入事件ANR超时时间一般为5s。在InputDispatcher分发输入事件的过程中,会监控是否发生了ANR。具体是在执行findFocusedWindowTargetsLocked()方法时,如果当前窗口还未准备好处理输入事件,则会调用handleTargetsNotReadyL
2017-09-30 19:45:55 1672
原创 应用程序注销输入事件通道
应用程序注销输入事件通道应用程序注销输入事件通道简介源码分析总结1.简介当Activity的窗口创建时,它会向InputManagerService注册输入消息接收通道;而当Activity窗口销毁时,它就会向InputManagerService注销前面注册的输入消息接收通道。WindowManagerService在处理处于Stopped状态的Activity窗口时,就会注销它们之前所
2017-09-30 19:44:59 813
原创 InputManagerService分发输入事件给应用程序(下)
InputManagerService分发输入事件给应用程序(下)InputManagerService分发输入事件给应用程序下简介源码分析总结1.简介在InputManagerService分发输入事件消息给应用程序(上)中介绍了InputReader从EventHub中获取输入事件,并对输入事件进行加工处理,然后将输入事件放入到InputDispatcher的mInboundQueue
2017-09-30 19:43:50 1288 1
原创 InputManagerService分发输入事件给应用程序(上)
InputManagerService分发输入事件给应用程序(上)InputManagerService分发输入事件给应用程序上简介源码分析小结1.简介在InputManagerService服务初始化时,会在Native层创建两个线程:InputDispatcherThread和InputReaderThread。InputReader线程负责读取输入事件,并把输入事件传递给InputD
2017-09-30 19:43:03 613
原创 应用程序注册输入事件通道
应用程序注册输入事件通道应用程序注册输入事件通道简介源码分析通过requestLayout函数更新InputManagerService中激活的Activity窗口把Server端输入事件通道注册到InputDispatcher的消息循环中把Client输入事件通道注册到应用程序的消息循环中总结1.简介InputManagerService服务启动以后,就要开始监控输入事件了。当In
2017-09-30 19:42:07 773
原创 InputManagerService服务的初始化
InputManagerService的初始化InputManagerService的初始化简介初始化流程总结1.简介Android系统的输入事件是由InputManagerService服务来监控的,而InputManagerService是由窗口管理服务WindowManagerService来启动的。WindowManagerService服务是在system_server进程中启动
2017-09-30 19:41:07 638
原创 Android输入系统概述
Android输入系统概述Android输入系统概述简介简介在Android系统中,输入事件是由WindowManagerService服务来管理的,然后再以消息的形式来分发给应用程序处理。当用户触摸屏幕或者按键操作,首次触发的是硬件驱动,驱动收到事件后,将该相应事件写入到输入设备节点, 这便产生了最原生态的内核事件。接着,输入系统取出原生态的事件,经过层层封装后成为KeyEvent或者Mot
2017-09-30 19:39:17 402
原创 智能指针
智能指针智能指针简介强指针sp弱指针wp重要函数实现总结1.简介1.指针问题的常见来源:指针没有初始化new了对象后没有及时delete野指针通过delete释放了对象,但没有将指针置空。 header 1 header 2 row 1 col 1 row 1 col 2 row 2 col 1 row 2 col 22.如何设计一个智能指针考虑的因素:
2017-09-26 23:26:46 313
原创 IO多路复用
I/O多路复用机制IO多路复用机制简介1流的概念2 IO同步异步阻塞非阻塞3 多路复用概念4 IO复用的优势IO复用函数介绍1 select函数2 Poll函数3epoll函数4 epoll相比于selectpoll的优势总结1.简介希望通过这篇文章,可以回答以下几个问题?为什么需要IO多路复用?什么是IO多路复用机制?IO多路复用的机制该怎么使用?epoll比se
2017-09-26 23:22:24 16884 5
原创 Handler消息机制(native层)
Handler消息机制(native层)Handler消息机制native层简介MessageQueue的native方法nativeInit方法nativePollOnce方法nativeWake方法总结1.简介在介绍Handler消息机制(Java层)时,我们看到了Java层的MessageQueue中调用了几个native方法。除此之外,native层也有一套完善的消息机制,用
2017-09-26 23:19:16 6305
原创 Handler消息机制(Java层)
Handler消息机制(Java层)Handler消息机制Java层简介消息循环1 Looperprepare2 Handler的构建3 Looperloop4 MessageQueuenext消息的发送1 HandlersendMessage2 MessageQueueenqueueMessage消息的处理1 HandlerdispatchMessageActivityT
2017-09-26 23:15:36 15163 2
原创 Touch Event事件分发流程
Touch Event的分发Touch Event的分发Activity的dispatchTouchEvent方法PhoneWindow的superDispatchTouchEvent方法ViewGroup的dispatchTouchEventView的DispatchTouchEvent事件点击事件的传递顺序是Activity->Window->View,从上到下依次传递。如果最底层的
2017-07-29 13:44:11 1141
原创 LayoutInflater流程
LayoutInflater流程LayoutInflater流程概述源码分析总结概述我们知道LayoutInflater的主要作用是从XML文件中加载布局,其主要是掉用inflate方法来加载布局。一般是通过如下方法使用:LayoutInflater.from(context).inflate(R.layout.xxxx, this);LayoutInflater.from(contex
2017-07-29 13:41:23 297
原创 ArrayMap与SparseArray源码分析
一ArrayMap简介源码分析1 构造方法2 添加元素3 获取元素4 移除元素二SparseArray简介源码分析1 构造方法2 添加元素3 获取元素4 删除元素5 其他方法三总结ArrayMap及SparseArray是android的系统API,是专门为移动设备而定制的。用于在一定情况下取代HashMap而达到节省内存的目的。本文将从源码的角度来分析ArrayMa
2017-06-10 18:01:30 1566
原创 Picasso开源库源码分析
一简介二源码分析1 加载图片11 构造Picasso实例对象12 利用load方法加载图片13 into方法将ImageView传入14 提交任务2 取消加载图片21 Dispatcher发送取消消息22 延迟请求的取消三Picasso关键类图四总结主流的加载图片框架有UIL(Universal-Image-Loader)、Picasso、Glide、Fresco,它们之间的对
2017-06-10 16:28:46 635
原创 Android StateMachine实践
我们在实际应用中经常遇到状态设计模式,Android 框架中给我们提供了一个经典的状态模式实现——StateMachine。在StateMachine之前,先来看下状态设计模式定义和UML类图。状态模式:当一个对象的内在状态改变时,允许改变其行为。状态模式中行为是由状态来决定的,不同的状态下有不同的行为。状态模式的意图是让一个对象在其内部状态改变时,其行为也随之改变。状态模式的UML类
2017-05-25 22:17:37 739
原创 ANR源码分析之ContentProviderClient Timeout
在上篇文章中,分析了Service Timeout的过程。这篇文章将继续分析ContentProviderClient Timeout的流程。当使用ContentProviderClient执行Provider相关操作时,会设定一个超时时间,如果在指定的超时时间内,没有完成操作,则会产生一个ANR。ContentProviderClient Timeout整体的流程如下:1.acqui
2017-05-24 00:51:34 2032
原创 ANR源码分析之Service Timeout
在前面的一篇文章中,分析了Broadcast Timeout的流程,接下来继续分析Service Timeout的流程。Service默认不会运行在子线程中,它也不会运行在一个独立的进程中,它同样执行在UI线程中,因此也不能在Service中执行耗时操作,否则也会产生的ANR。Service Timeout整体流程如下图所示:1.startService(ContextIm
2017-05-24 00:42:48 5858
原创 ANR源码分析之Broadcast Timeout
在上篇文章中,介绍了InputDispatcher Timeout的流程。本篇文章将介绍Broadcast Timeout的流程。 我们知道广播根据注册的方式的可以分为静态注册广播和动态注册广播,根据发送方式可以分为普通广播、有序广播、Sticky广播以及APP内广播。广播执行的方式有两种,一种是串行执行,另外一种是并发执行。并发执行的广播是不存在超时的情况,例如动态注册的非有序的广播。而串行执行
2017-05-24 00:23:43 2475
原创 ANR源码分析之InputDispatcher Timeout
在上篇文章中,介绍ANR产生的原因、ANR的分类以及ANR问题的分析。本篇文章接下来将从源码的角度来分析ANR产生的过程,首先介绍InputDispatcher Timeout产生的过程。在ANR产生时,最终都会调用到appNotResponding()方法,该方法在Android 7.0以前定义在ActivityManagerService.java类中,在Android 7.0中定义在AppE
2017-05-24 00:03:54 2761
原创 ANR问题浅析
我们在Android应用开发中,会经常遇到ANR问题。本文将从ANR产生的原因、ANR的分类、ANR问题的分析、ANR问题的常见解决办法这几个方面来介绍ANR。最后会通过分析ANR源码,了解ANR产生的过程。一、ANR简介ANR是Application Not Responding的简称,即应用无响应。ANR产生的原因是由于应用在主线程阻塞了,导致界面无响应。超时的原因一般为两种:
2017-05-23 22:34:50 10340
原创 JNI开发之JNI实践
在上一篇文章中介绍了JNI开发的环境搭建,这篇文章将用两个实例来介绍JNI开发。JNI开发大致可以分为两类:一类是Java调用本地代码方法;另外一类是本地方法访问Java成员。接下来将分别介绍这两种情况。一、Java代码调用本地方法在JNI原理那篇文章中,介绍了Java代码调用本地方法的一般步骤。接下来将以实际的例子来描述Java代码调用本地方法的过程。在这个例子中,在Java代码中调用本
2017-05-20 14:51:29 667 1
原创 JNI开发之环境搭建
在上篇文章中介绍了JNI内存泄露的一些场景,这篇文章将描述JNI开发环境的搭建。JNI开发的环境搭建将从NDK简介、NDK环境配置之Eclipse、NDK环境配置之Linux、NDK环境配置之Android Studio、NDK之Android.mk文件、NDK之Application.mk文件这几个方面来介绍在各个软件平台下JNI开发环境的搭建。一、NDK简介NDK简介:http
2017-05-20 14:03:16 574
原创 JNI开发之JNI内存泄露
在上篇文章中介绍了JNI开发中遇到的常见错误,这篇文章将描述JNI开发中内存泄露问题。在Java编程中,内存泄漏可以根据泄漏的内存位置划分为两种:一种是JVM中的Java Heap的内存泄漏。另外一种是JVM中的Native memory内存泄漏。一、Java Heap内存泄漏 Java对象存储在JVM进程空间中的Java Heap中,Java Heap可以在JVM运行过程中动态
2017-05-20 12:27:52 4516
原创 JNI开发之JNI常见错误
在上一篇文章中对JNI原理进行了介绍,这篇文章将对JNI开发中的一些常见错误进行总结一下。一、常见错误原因分析 在JNI开发中,经常会遇到各种各样的错误,这里总结一下:find Library returned null 原因:CPU平台不匹配或者在加载类库时,类库名字写错了Exception in thread"main" java.la
2017-05-20 12:20:52 6172 1
原创 JNI开发之JNI原理
在上一篇文章中对JNI简单介绍了,在这篇文章中将对JNI原理进行介绍。本篇文章将以JNI执行环境、JNI数据类型、JNI注册方式、JNI引用、JNI变量共享以及JNI调用方式来介绍JNI原理。 一、执行环境(Runtime) 在计算机中,每种编程语言都有一个执行环境(Runtime),执行环境用来解释执行语言的语句。 在JNI开发中有两个比较重要与执行环境Runtim
2017-05-19 23:55:04 1696
原创 JNI开发之JNI简介
一、JNI简介 什么是JNI? JNI(Java Native Interface,Java本地接口),用于衔接Java层与Native(C/C++)层。Java可以通过JNI调用本地的C/C++代码,本地的C/C++代码也可以通过JNI调用Java代码。 这不是Android系统所独有的,而是Java所有。众所周知,Java语言是跨平台的语言,而这跨平台的背后都是依靠J
2017-05-19 22:19:48 509
原创 JNI开发
最近在学习JNI开发的知识,现将相关的知识总结一下。文章将从JNI简介、JNI原理、JNI常见错误、JNI内存泄露、JNI开发环境搭建、JNI实践这几个部分来分享JNI开发的知识,每一个部分都会以单独的文章来描述。上图是JNI开发知识的一个总的概括,接下来的文章将分别介绍每一个部分。
2017-05-19 22:12:09 263
原创 Map集合介绍
一、简介 映射表(也称关联数组)的基本思想是它维护的是键-值(对)关联,因此你可以使用键来查找值。标准的Java类库中包含了Map的几种基本实现,包括:HashMap、TreeMap、LinkedHashMap,WeakHashMap,ConcurrentHashMap。他们都有同样的基本接口Map,但是行为特性各不相同。这主要表现在效率、键值对的保存及呈现次序、对象的生命周期、映射表如
2017-05-12 22:04:10 1291
原创 AsyncTask源码分析
一、简介 AsyncTask允许你执行后台耗时操作,并将结果发布到UI线程。整个实现过程不需要多个Thread或者Handler。 AsyncTask是被设计来替代Handler与Thread组合的一种方式,它不需要构建通用的线程框架。 AsyncTask理想的情况下是用来执行短时间的操作,例如几秒种操作。如果需要执行一些长时间的耗时操作,推荐使用并发执行框架,例如E
2017-05-02 22:57:37 256
原创 SparseArray源码解析
1.SparseArray简介 SparseArray的主要作用是将Integers映射到Objects,相当于Map。当需要将Integers映射到Objects时,SparseArray比HashMap更高效。因为SparseArray避免自动装箱keys,并且它的数据结构不依赖于外部的Entry。 SparseArray是在一个数组结构中维护它的映射关系,通过二分查找来查找k
2017-04-26 22:11:25 332
原创 WakeLock的介绍与使用
1.什么是WakeLock WakeLock是一种机制,表示应用需要设备保持运行(stay on)。 WakeLock默认是引用计数,如果WakeLock是引用计数的话,则调用了几次acquire()方法,就需要调用对应次数的release()方法才能真正释放掉WakeLock。 如果WakeLock不是引用计数的话,则调用一次release()函数,就可以释放前面调
2017-04-21 21:27:38 8255 1
原创 is 32-bit instead of 64-bit动态库错误分析
前段时间因项目需要,需要MP3格式的录音,需要引用LAME开源库,在引用so库文件时,提示java.lang.UnsatisfiedLinkError: dlopen failed: "liblame.so" is 32-bit instead of 64-bit错误,网上分析了出现这种情况的原因,可能是混合使用了32bit和64bit的库文件,如果系统先使用64bit的库文件时,则后续的库文件都
2016-07-20 23:07:53 7001 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人