- 博客(82)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 狼人杀语音法官助手
狼人杀语音法官助手简介为什么叫语音法官助手呢?因为他可以自己在黑夜里叫玩家睁眼闭眼,记录 游戏状态,这样当玩狼人少一个法官,或者大家都要玩的时候,有一个手机当法官,岂不是美滋滋?版本V 1.1.0 版本增加重新选择人数以及角色功能,可以重新选择游戏人数,重新选择游戏角色; 修复一些已知Bug;V 1.0.0 版本1.0.0版本暂时只提供第一页的记录功能...
2019-12-30 14:56:23
15155
2
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 主流视频通话SDK比较
视频通话框架主流的视频通讯框架比较多,此文主要通过Android平台的来做SDK平台使用的比较。现在的视频热门框架有一些如:Jitsi Jitsi是一个开源的,安全(ZRTP加密),高质量的SIP/XMPP视频通话、会议、聊天、桌面共享、文件传传输。可以安装在你喜欢的操作系统中并且支持多种IM网络。官方网站:https://jitsi.org/SIPDroid
2017-01-11 17:54:29
25610
12
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Android摄像头获取实时数据+Demo
首先需要用到的是一个叫Camera类的,更新的一个叫Camera2的类。Camera2是从 SDK 5.0(API Level 21)开始才被引入的。里面的方法有些还是比原来的方便许多的,但是,用户系统版本参差不齐,所以暂时还是使用Camera来进行开发。SufaceView这个View可以直接重内存或者DMA等硬件接口获取所得的图像数据,是
2016-10-06 18:19:07
17013
8
原创 如何在Activity中获取调用者 -- getReferrer()
如何在Activity中获取调用者 – getReferrer()前言为什么要在Activity中获取调用者?主要是安全和定制两个方面的需求吧。安全需求:一般Activity如果已经对外开放了(即exported为true,或者加了Intent-filter),那么对Activity的保护就会降低,形成Activity攻击面,引入了风险。如果只对某几个app开放其Activity,则...
2019-12-29 23:24:01
1479
原创 Java线程Dump分析
Thread Dump介绍什么是Thread DumpThread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机打印的thread dump略有不同,但是 大多都提供了当前活动线程的快照,及JVM中所有Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能的话...
2019-10-30 08:47:49
6900
原创 源码解析view的显示判断用isShown()还是View.VISIBLE
前言平时我们对View的显示判断都是用简要的方式去判断,那么,究竟是用view.isShown()去判断还是用view.getVisibility() == View.VISIBLE 判断好呢?其实可以来看看源码public boolean isShown ()Added in API level 1Returns the visibility of this view and all...
2019-10-18 20:30:02
582
原创 编译出错 ninja: build stopped: subcommand failed Android
解决方法错误:ninja: build stopped: subcommand failed.办法一:按照提示:ulimit -c unlimited该命令的详细解释参考:https://www.cnblogs.com/qq78292959/archive/2012/05/08/2490443.html命令解释:ulimint -a 用来显示当前的各种用户进程限制Linux对于每个用...
2019-10-16 08:40:26
40414
原创 Android 适配之FileProvider的使用
Android 7.0 文件权限的变化为了提高私有文件的安全性,在targetSdk版本为N或者以后版本的app中,其私有目录将会限制访问。这可以防止私有文件元数据的泄露,比如文件大小或者是文件是否存在。但这给开发者带来了一些不利的影响:文件的所有者不能放宽文件权限,如果你使用MODE_WORLD_READABLE或者 MODE_WORLD_WRITEABLE操作文件,将会触发Secur...
2019-08-30 21:04:59
24183
原创 使用Android Studio批量转换图片为Webp格式
简介Webp是一个现代的图片格式提供优秀的无损和有损压缩。使用Webp我们可以创建更小更丰富的图片。Webp无损图片比PNG图片的size小26%。Webp有损图片在同等SSIM(结构化相似)质量下比JPEG小25-34%。无损Webp支持透明度(透明通道)只占22%额外的字节。如果可以接受有损RGB压缩,有损Webp也支持透明度,通常比PNG文件size小3倍。具体方法Android ...
2019-08-30 20:32:59
4179
原创 AtomicInteger类的理解与使用
前言JDK1.5之后的java.util.concurrent.atomic包里,多了一批原子处理类。AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。主要用于在高并发环境下的高效程序处理,来帮助我们简化同步处理.AtomicInteger类的理解与使用首先看两段代码,一段是Integer的,一段是AtomicInte...
2018-09-05 19:23:06
638
原创 HTTP缓存控制小结
前言通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本。因此,缓存和重用以前获取的资源的能力成为优化性能很关键的一个方面。与缓存相关的HTTP首部字段我们先来瞅一眼RFC2616规定的47种http报文首部字段中与缓存相关的字段,事先了解一下能让咱在心里有个底:通用首部...
2018-09-04 20:34:23
737
原创 Android开发之全局异常捕获
前言大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了崩溃现象,开发者应该及时获取在该设备上导致崩溃的信息,这对于下一个版本的bug修复帮助极大,所以今天就来介绍一下如何在程序崩溃的情况下收集相关的设备参数信息和具体的异常信息,并发送这些信息到服...
2018-09-04 19:43:02
3916
原创 Android内存优化--使用SparseArray和ArrayMap代替HashMap
前言在Android开发时,我们使用的大部分都是Java的api,比如HashMap这个api,使用率非常高,但是对于Android这种对内存非常敏感的移动平台,很多时候使用一些java的api并不能达到更好的性能,相反反而更消耗内存,所以针对Android这种移动平台,也推出了更符合自己的api,比如SparseArray、ArrayMap用来代替HashMap在有些情况下能带来更好的性能提...
2018-09-04 19:25:14
352
原创 Java 类加载机制
前言类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示:其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为...
2018-08-29 19:41:39
234
原创 Java 内存模型及GC原理
前言一个优秀Java程序员,必须了解Java内存模型、GC工作原理,以及如何优化GC的性能、与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能。本文将从JVM内存模型、GC工作原理,以及GC的几个关键问题进行探讨,从GC角度提高Java程序的性能。Java内存模型按照官方的说法:Java 虚拟机...
2018-08-29 13:00:38
293
原创 什么是死锁及死锁的必要条件和解决方法
前言在计算机系统中有很多一次只能由一个进程使用的资源,如打印机,磁带机,一个文件的I节点等。在多道程序设计环境中,若干进程往往要共享这类资源,而且一个进程所需要的资源不止一个。这样,就会出现若干进程竞争有限资源,又推进顺序不当,从而构成无限期循环等待的局面。这种状态就是死锁。系统发生死锁现象不仅浪费大量的系统资源,甚至导致整个系统崩溃,带来灾难性后果。所以,对于死锁问题在理论上和技术上都必须给...
2018-08-26 20:59:34
521
原创 Java 多线程加锁的方式总结及对比
前言Java多线程可以通过:synchronized关键字Java.util.concurrent包中的lock接口和ReentrantLock实现类这两种方式实现加锁。Lock 和 synchronizedsynchronized关键字加锁的缺陷如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直...
2018-08-25 10:14:41
324
原创 LruCache 源码解析
简介 LRU 是 Least Recently Used 最近最少使用算法。 曾经,在各大缓存图片的框架没流行的时候。有一种很常用的内存缓存技术:SoftReference 和 WeakReference(软引用和弱引用)。但是走到了 Android 2.3(Level 9)时代,垃圾回收机制更倾向于回收 SoftReference 或 WeakReference 的对象。后来,...
2018-08-15 08:31:36
317
原创 Android高效加载大图、多图解决方案,有效避免程序OOM
高效加载大图片我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨率高得多。大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。我们可...
2018-08-15 07:54:47
261
原创 Android应用层View绘制流程与源码分析
前言Activity中界面加载显示的基本流程原理,最终分析结果就是下面的关系: 看见没有,如上图中id为content的内容就是整个View树的结构,所以对每个具体View对象的操作,其实就是个递归的实现。Android中的任何一个布局、任何一个控件其实都是直接或间接继承自View实现的,当然也包括我们后面一步一步引出的自定义控件也不例外,所以说这些View应该都具有相同的绘制流程与...
2018-08-12 20:36:07
251
原创 Retrofit2.0 源码分析
前言注解式的框架非常火,注解以其轻量,简洁等特性被人们所喜爱者,关键是它解藕。网络请求的框架非常多,比较受欢迎的当属retrofit和okHttp了。连retrofit都是基于okHttp之上开发的。ok, 言归正传,我们来聊聊retrofit。如果对okhttp有疑问的可以阅读我的这篇文章:okhttp3 源码详细解析简介特别注意:准确来说,Retrofit 是一个 R...
2018-08-10 08:35:40
345
原创 详解Java中的clone方法 -- 深拷贝和浅拷贝
Java中对象的创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?使用new操作符创建一个对象使用clone方法复制一个对象那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存。程序执行到ne...
2018-08-08 08:21:35
2003
6
转载 Android 9 Pie 现已面向全球正式发布!
前言经历一年多的开发和数月以来早期用户的反复测试,最新 Android 平台 —— Android 9 Pie 终于正式面向全球发布!Android 9 利用人工智能技术,让您的手机更加智能、简洁与人性化。请通过本文了解 Android 9 的所有新特性,同时也希望各位开发者能够借助 Android 9,全面提升应用性能,打造出色体验,让您的应用与用户走得更近!在 Android ...
2018-08-08 08:08:29
1584
原创 okhttp3 源码详细解析
前言OkHttp是一个非常优秀的网络请求框架。目前比较流行的Retrofit也是默认使用OkHttp的。所以OkHttp的源码是一个不容错过的学习资源。基本使用从使用方法出发,首先是怎么使用,其次是我们使用的功能在内部是如何实现的.源码地址OkHttpClient client = new OkHttpClient();String run(String url) thro...
2018-08-04 22:34:23
1023
原创 LeakCanary 原理浅析
前言提到Java语言的特点,无论是教科书还是程序员一般都会罗列出面向对象、可移植性及安全等特点。但如果你是一位刚从C/C++转到Java的程序员,对Java语言的特性除了面向对象之外,最外直接的应当是在Java虚拟机(JVM)在内存管理方面给我们变成带来的便利。JVM的这一大特性使Java程序员从繁琐的内存管理工作中得到了一定解放,但是JVM的这个特点的实现也是有代价的,并且它也并非万能。因此...
2018-08-04 09:59:59
3821
原创 Java中守护线程的总结
前言在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。 Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应...
2018-08-04 08:56:53
300
原创 Java线程池详解
前言我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果。今...
2018-08-03 08:51:45
278
原创 ThreadLocal详解分析
前言要了解ThreadLocal,首先搞清楚ThreadLocal 是什么?是用来解决什么问题的? ThreadLocal 是线程的局部变量, 是每一个线程所单独持有的,其他线程不能对其进行访问, 通常是类中的 private static 字段,是对该字段初始值的一个拷贝,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联我们知道有时候一个对象的变量会被多个线程所访问,...
2018-08-02 08:38:15
304
3
原创 Android布局优化之标签include,viewstub,merge
前言布局优化对于每个项目总是必不可少,本文主要介绍使用抽象布局标签(include, viewstub, merge)、去除不必要的嵌套和View节点、减少不必要的infalte及其他Layout方面可调优点,顺带提及布局调优相关工具(hierarchy viewer和lint)。抽象布局标签< include >标签include标签常用于将布局中的公共部分提...
2018-08-01 08:59:35
605
原创 Android ListView与RecyclerView对比浅析
前言RecyclerView是谷歌官方出的一个用于大量数据展示的新控件,可以用来代替传统的ListView,更加强大和灵活。弄清楚RecyclerView是否有足够的吸引力替换掉ListView,我从性能这一角度出发,研究RecyclerView和ListView二者的缓存机制,并得到了一些较有益的”结论”,待我慢慢道来。同时也希望能通过本文,让大家快速了解RecyclerView与L...
2018-08-01 08:31:27
6601
原创 Android应用程序的启动过程
前言在Android系统中,Activity和Service是应用程序的核心组件,它们以松藕合的方式组合在一起构成了一个完整的应用程序,这得益于应用程序框架层提供了一套完整的机制来协助应用程序启动这些Activity和Service,以及提供Binder机制帮助它们相互间进行通信。在Android系统中,有两种操作会引发Activity的启动,一种用户点击应用程序图标时,Launcher会...
2018-07-29 22:44:52
1348
原创 HashMap工作原理
前言几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别 ,那么为何这个问题如此特殊呢?是因为这个问题的深度很深。ConcurrentHashMap和其它同步集合的引入让这道题变得更加复杂。让我们开始探索的旅程吧!循序渐进“你用过HashMap吗?” “什么是HashMap?你为什么用到它?”几乎每...
2018-07-29 15:02:47
307
原创 JAVA / Android 设计模式之适配器(Adapter)模式
简介定义适配器模式,即定义一个包装类,用于包装不兼容接口的对象包装类 = 适配器Adapter; 被包装对象 = 适配者Adaptee = 被适配的类主要作用把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。适配器模式的形式分为:类的适配器模式和对象的适配器模式解决的问题原本由于接口不兼容而不能一起工作...
2018-07-23 20:18:40
349
原创 JAVA / Android 设计模式之建造者(Builder)模式
前言在使用一些热门第三方框架的时候,我们往往会发现,比如okHttp的client,初始化retrofit 对象,初始化 glide 对象等等,都用了这样:Retrofit.Builder().baseUrl(baseUrl).client(getClient()).addConverterFactory(FastJsonConverterFactory.create()).a...
2018-07-12 20:40:06
447
原创 git 出现 error Missing tree 的处理办法
问题公司搭建了 gerrit 代码审核服务器.有较低的概率(目前团队中出现过两例),在 git push 提交时,出现如下错误:git push --receive-pack='git receive-pack --reviewer xxx@xxx.cn --reviewer xx@xx.cn' review HEAD:refs/for/masterCounting objects:...
2018-07-09 19:36:41
3890
原创 Android开发@IntDef完美替代Enum (枚举)
概要Enum 是 java 中一种包含固定常数的类型,当我们需要预先定义一些值时,我们使用 Enum,这样做通常为了在编译时期避免接受额外常量引起的错误。而且,Enum 增加了APK 的大小,比常量多5到10倍的内存占用,这是关于应用性能的最佳实践.使用 Enum 的缺点每一个枚举值都是一个对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 String 会占...
2018-06-14 13:25:02
1767
原创 JAVA / Android 设计模式之策略模式
前言策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。背景在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一...
2018-06-13 12:46:02
430
原创 在 Android Studio 上实时调试数据库( SQLite )
SQLScout安装SQLScout 是一个 Android Studio 的插件,通过点击:Setting —&gt; Plugings —&gt; Browse Repositories搜索 SQLScout 安装即可。要是下载不动,可以到 这里 下载,然后点击 Install plugin from disk 导入。加载成功安装后重启 Andro...
2018-06-11 19:33:31
4045
原创 JAVA设计模式之单例模式
概念java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。单例模式有以下特点: 单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡...
2018-05-21 21:10:10
355
原创 Android Studio 插件推荐
简述现在用AndroidStudio的越来越多了,工具当然也是必不可少的,这里收集了平时觉得不错的插件共享给大家。安装说明给出的插件,可直接根据名字,在AndroidStudio - File - Setting - Plugins - Browse Respositories中搜索插件,下载成功后,重启AndroidStudio即可。热腾腾的插件已经躺好了Mate...
2018-05-13 18:05:01
3385
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人