自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

viclee

博观而约取 厚积而薄发

  • 博客(146)
  • 资源 (4)
  • 收藏
  • 关注

原创 一个常见Android崩溃问题的分析

这个错误大家应该都有遇到过:IllegalStateException: Can not perform this action after onSaveInstanceState。最近又遇到这个问题,就想要梳理一下其中的一些细节。 我的具体使用场景是在一个AsyncTask的回调onPostExecute中调用了FragmentTransaction的commit方...

2019-05-28 23:34:13 1730

原创 关于Java中Serializable的一些问题

在面试中我常常会考察Serializable相关的问题,我认为这是一个很基础的知识点,是对候选人基础是否扎实的考察。但是结果有点出乎意料,候选人往往只是知道它和序列化有关,而对于其中的细节以及更深层次的原理都不是很清楚。因此,我决定整理一下Serializable相关的一些问题,希望能够对不了解的同学有所帮助。 一个类实现Serializable接口后可以被序列化。这...

2019-05-15 00:04:48 1952

原创 SharedPreferences最佳实践

        Android开发中,我们经常会用到SharedPreferences,它是一种轻量的数据存储方式,通常用来存储一些简单的配置信息。看了网络上的一些文章,感觉都不是特别满意,因此希望能结合自己的经验和理解写一篇分析SharedPreferences的文章。本文不会讲解SharedPreferences的基本用法,而是会结合源码来分析SharedPreferences的工作原理,以及...

2019-01-08 23:48:13 647 2

原创 Android视频开发基础(五)

       今天这篇文章我们来讲点实用的内容。我们在进行需求开发的同时,有时候也需要去排查一些问题,今天就来讲讲我们可以借助哪些工具来分析和处理视频文件。由于本人使用的是mac,讲解均以mac为例。       今天主要讲解的几个工具是ffmpeg、ffprobe、qt-faststart和AtomicParsley。 ffmpeg       ffmpeg是一套用来记录、转换音...

2018-12-23 23:04:02 2408 4

原创 Android视频开发基础(四)

       前面几篇文章介绍了视频技术中最基础的概念以及Android中关于视频处理的一些知识,这些都是Android视频功能开发必须掌握的基础。这一篇文章作为这个系列的第四篇,主要来介绍直播相关的概念。       在这篇文章中,你可以学习到以下内容:1.当前直播产品的现状和面临的挑战2.直播系统的整体架构是怎样的3.直播客户端的结构如何4.常用的直播协议有哪些,他们有什么...

2018-12-17 21:28:57 2396

原创 Android视频开发基础(三)

        接着之前两篇文章继续来讲Android视频开发这个主题。今天这篇文章,我们来聊一聊Android中MediaPlayer的DataSource。也许有的同学会觉得奇怪,DataSource有什么好讲的,我们直接调用MediaPlayer的setDataSource方法不就可以了。其实我们要讲的是更深层次的问题:怎么来干预视频播放器获取数据的过程。要解释这个问题,首先我们先来看看原生...

2018-12-07 17:06:14 2341

原创 Relinker源码分析

       作为源码分析的第一篇文章,我们先从一个相对简单的开源库开始:Relinker。这库由来已久了,github也有1000+的star。我在工作中虽然有用到这个库,却一直没仔细看过源码,今天我们就来分析一下。      开始之前先来讲讲背景。      开发中我们常常会遇到这样的异常:java.lang.UnsatisfiedLinkError: Couldn’t load ...

2018-12-03 10:23:55 5341 2

原创 Android视频开发基础(二)

       前一篇文章详细介绍了视频的一些基本概念,这些内容与Android系统本身没有密切关系,只是作为熟悉视频领域的一个基础,便于介绍接下来关于Android上视频处理的其他内容。继续来看Android上视频相关的内容。      Android支持的格式      先来看一下Android官网上给出的Android系统支持的文件格式。      从图中我们可以看到   ...

2017-03-20 23:34:06 4736 11

原创 Android视频开发基础(一)

        最近项目中实现了短视频的功能,主要包括视频的编辑处理、上传和播放。这是第一次真正略深入的接触视频开发,项目中接触到许多新的概念,也踩了很多坑,整体感觉视频处理还是十分复杂的知识体系,需要花大量的精力和时间才能很好的掌握这项技术。       下面就谈一谈其中涉及到的一些基础内容,也作为对之前工作的回顾。 基本概念码率       码率就是数据传输时单位时间...

2017-03-16 00:04:44 23398 10

原创 Android VideoView播放本地视频短暂黑屏的解决方法

       新的大版本终于正式发布了,整整三个月,做的心力交瘁,导致好久都没有更新文章了。最近接触了许多新的知识,也算是忙碌中有所收获。希望接下来的时间工作上能够稍微松缓一些,让我可以利用在家的闲余时间把一些内容整理总结,慢慢消化一下。今天首先来谈一谈前段时间遇到的一个关于ViewView的问题。        VideoView在Android视频播放中很常用,用法也比较简单。但是,我...

2017-03-14 21:34:24 34066 17

原创 Android匿名共享内存和MemoryFile

       今天要讲的内容相对冷门,日常开发中的使用率较低。但是,在某些场景下,它也许可以带给我们一个新的思路,帮我们解决一些棘手的问题,因此我觉得有必要谈一谈Android中的匿名共享内存(Ashmem)。       首先来看一下什么是匿名共享内存(Ashmem)。Ashmem是一种共享内存的机制,它利用了Linux的mmap系统调用,将不同进程中的同一段物理内存映射到进程各自的虚拟地址...

2016-11-14 21:10:48 15122

原创 浅析Python运算符重载

Python语言中提供了运算符重载功能,这一点与C++有点类似,却又和C++有些许多的不同。Python的运算符重载是通过重写一些Python内置的方法实现的。这些运算符方法都是以双下划线开头和结尾的,类似于__X__的形式,python通过这种特殊的命名方式来拦截操作符,以实现重载。当Python的内置操作运用于类对象时,Python会去搜索并调用指定的方法完成运算符操作。

2016-09-20 23:14:38 36229 7

原创 Android无法显示超大图问题的探索

       最近在做图片浏览功能时遇到了一个很蛋疼的问题,在开启硬件加速情况下,超大图无法正常显示(图的长宽有一个大于9000),而且程序不会crash,只是图片加载不出来,View显示为黑色。通过查看日志,发现系统打印出了下面的内容: W OpenGLRenderer( 4014): Bitmap too large to be uploaded into a texture (6...

2016-08-22 22:44:08 4834 1

原创 关于Base64编码的理解

       之前在很多业务中都有见过或者用到过Base64编码,但一直一知半解,没有对它有一个深入的认识和理解。今天就来聊一聊Base64编码的问题。       首先要明确的是,Base64是一种可逆的编码方式,提到编码方式,我们首先想到的肯定是Ascii、GBK、Unicode这些常用的编码方法,那么Base64与这些编码方式有什么不同呢?       简单来将,Base64就是一种...

2016-08-06 17:46:47 10702 1

原创 通过Python脚本读取apk信息

       本文将主要介绍通过Python脚本检测apk信息的功能,介绍具体的实现之前,首先介绍一个Android SDK中的开发工具aapt。       aapt即Android Asset Packaging Tool,我们可以在Android SDK的platform-tools目录下找到该工具。aapt可以查看、 创建、 更新ZIP格式的文档,也可将资源文件编译成二进制文件,And...

2016-07-23 21:47:48 18656

原创 Java单例模式——并非看起来那么简单

        Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在。一些管理器和控制器常被设计成单例模式。       单例模式有很多好处,它能够避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间;能够避免由于操作多个实例导致的逻辑错误。如果一个对象有可能贯穿整个应用程序,而且起到了...

2016-07-20 23:48:19 88420 17

原创 深入理解Java的ThreadLocal

       Android中的多线程并发场景,通常是通过线程同步的方式去保证线程安全。对于共享资源,需要通过syncronized或者Lock等线程同步方法实现资源的互斥访问,才能确保数据访问的正确性。       今天要介绍的ThreadLocal为解决多线程并发问题提供了一种新思路。想必熟悉Java的同学对ThreadLocal并不陌生,今天我们就一起来探讨ThreadLocal。 ...

2016-07-18 22:19:27 1226

原创 Android RelativeLayout和LinearLayout性能分析

       LinearLayout和RelativeLayout是Android中最常用的两个布局容器,在分析它们的性能之前,我们先来看一个问题。       为什么使用Android Studio新建一个Blank Activity时默认的layout是RelativeLayout,而不是LinearLayout?       我觉得这是基于性能的考虑,使用 LinearLayout...

2016-05-22 14:32:58 4146 1

原创 贝塞尔曲线在Android中的应用

       今天要讲解的内容是Android中贝塞尔曲线的应用。可能很多人对贝塞尔曲线不甚了解,这里先对它的概念做一下简单介绍。       贝塞尔曲线由多个点组成:起始点、终止点以及0到n个相互分离的中间点。根据中间点的不同,可以分为线性贝塞尔曲线、二阶贝塞尔曲线、三阶贝塞尔曲线和高阶贝塞尔曲线。一般的矢量图形软件通过它来精确画出曲线,贝塞尔曲线由线段与节点组成,节点是可拖动的支点,线段像...

2016-05-14 21:25:38 5317 7

原创 Android中用到的设计模式

       Android系统使用Java语言进行开发,Android源码中设计模式的使用无处不在,以至于日常的开发中,也会根据不同的情况直接套用相应的设计模式。阅读Android源码的一大乐趣就是可以学习到Google大牛对设计模式的灵活运用。下面就来看一下Android系统都用了哪些常用的设计模式。模板方法模式       这应该是我们在Android开发中接触的比较早的设计模式。新...

2016-05-13 00:00:18 5274 3

原创 Java的Atomic类分析

Atomic包介绍       Java1.5的Atomic包名为java.util.concurrent.atomic。这个包提供了一系列原子类。这些类可以保证多线程环境下,当某个线程在执行atomic的方法时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个线程执行。Atomic类在软件层面上是非阻塞的,它的原子性其实是在硬件层面上借助相...

2016-05-08 18:53:52 12691

原创 你不知道的Bundle

Bundle基本概念     在Android中,Bundle主要用于传递数据,它是以键值对的形式保存数据。我们经常使用Bundle在Activity之间传递数据,数据类型可以是基本类型或它们对应的数组,也可以是对象或对象数组。当Bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口。     根据Android的设计,同一应用的Activity可...

2016-05-07 19:28:57 2896 2

原创 Java自旋锁

自旋锁的由来       计算机系统资源总是有限的,有些资源需要互斥访问,因此就有了锁机制,只有获得锁的线程才能访问资源。锁保证了每次只有一个线程可以访问资源。当线程申请一个已经被其他线程占用的锁,就会出现两种情况。一种是没有获得锁的线程会阻塞自己,等到锁被释放后再被唤起,这就是互斥锁;另一种是没有获得锁的线程一直循环在那里看是否该锁的保持者已经释放了锁,这就是自旋锁。 自旋锁的优缺点...

2016-05-05 23:29:16 4364

原创 Android图片适配问题分析

一些重要概念       首先来看一些Android屏幕适配相关的基本概念:屏幕尺寸:单位为英寸(inch),也就是我们常说的手机屏幕是多少寸。这个尺寸指的是屏幕对角线的长度。分辨率:屏幕高和宽的像素数, 现在常见的分辨率有640*480、1280*720、1920*1080。px:像素,显示屏上的一个光点就是一个像素。dp(dip):设备无关像素,Android上特有的一种度...

2016-05-04 21:15:56 4495

原创 Android反编译和二次打包实战

       作为Android开发者,工作中少不了要反编译别人的apk,当然主要目的还是为了学习到更多,取彼之长,补己之短。今天就来总结一下Android反编译和二次打包的一些知识。首先声明本文的目的是为了通过例子讲解反编译和二次打包的原理和方法,继而作为后续讲解防止二次打包和App安全的依据,并不是鼓励大家去重新打包别人的App,盗取他人劳动成果。       本文首先介绍几种Androi...

2016-04-14 00:33:26 23245 5

原创 100行代码实现Activity右滑退出

       很多Android App上已经增加了Activity右滑退出的效果,这个功能通常可以叫做SwipeBackActivity。这个效果最早来源于iOS,这样的操作优化确实提升了用户体验。在github上大概看了一下,实现很多也比较复杂。本文将介绍一种简单的方法来实现这个功能,只需在页面中调用两行代码就可以轻松搞定,对页面基本没有侵入性。        先来看一下最终的效果图...

2016-04-13 20:18:14 5513 9

原创 Android调试系列之dumpsys命令

       Android提供了dumpsys工具,可以用于查看很多系统服务信息。我们可以直接执行dumpsys命令,会将所有服务信息都列出来。但是这样得到的结果太多,不容易拿到有效的信息,可以在命令后面加上相应的参数来得到具体的服务信息。使用方法为dumpsys   [service]       下面简单列出了常用的service: meminfo 显示内存信息activ...

2016-04-11 23:03:15 8568

原创 Android插件换肤功能实战

       Android App实现换肤有多种思路,有的是通过内置资源的方式,有的是通过设置相同签名并且AndroidManifest.xml中配置相同android:sharedUserId使得两个apk运行在同一个进程中来互相访问数据。但是这些方式都有其局限性,实现不够灵活。今天来聊一下通过插件的方式换肤的原理及实现。       这种实现方式的大概思路是这样的:1)创建宿主工程,...

2016-04-08 00:53:22 2940

原创 Java动态代理

代理模式       在讲解动态代理之前,先来简单说一下代理模式。代理模式的作用是为某个对象提供一个代理以控制对这个对象的访问。代理对象和被代理对象需要实现相同的接口,调用者直接与代理对象交互,被代理对象对调用者来说是透明的。某些情况下,一个对象不希望或者不能被外部直接引用就可以考虑使用代理模式。       代理模式涉及到三个部分:抽象接口:代理对象和被代理对象的共有接口; 代理...

2016-04-07 21:12:41 1095

原创 Android Studio不能获取远程依赖包的解决方法

       最近被一个AS的sync问题困扰,在引入远程依赖包的时候,会出现一个sync错误,提示找不到这个类库。然而,并不是所有的工程都会出现这个问题,有的工程引入同样的类库却没有问题。       Error:(25, 13) Failed to resolve: com.jakewharton:butterknife:5.1.1       网上查了下(http://stack...

2016-03-27 18:35:42 45075 18

原创 Android调试系列之开发者选项常用功能

       开发者选项是Android为开发者提供的一个APP验证、调试、优化等各种功能的入口,它可以帮助我们提高调试效率,协助发现一些bug。这个功能的入口在每个Rom上的位置不尽相同,我的小米手机显示位置是在“其他高级设置”里。有的Rom对开发者模式进行了隐藏,通常的开启方法是进入到设置里的“关于手机”,然后快速连续点击版本号多次,就会显示出来。       今天来总结一下开发者模式中常...

2016-03-20 15:46:55 16578

原创 Android Handler深度分析

        Handler在Android开发中的使用频率很高,在子线程中使用它可以实现更新UI的功能。为了更好的理解Handler机制,本文将对Handler进行一些深入的探讨,探讨主要针对几个问题来展开。至于Handler的基础原理和使用方法,请自行Google。为什么Android要求子线程只能使用Handler更新UI?       如果不使用Handler的方式更新UI,...

2016-03-09 20:05:09 4391 12

原创 自定义垂直滚动切换TextView

       很多app的首页都会有一个用于显示热点消息的banner,通过垂直切换文本的方式动态展示消息。垂直切换的方式可以有效利用空间显示更多的内容,动态的效果也更能吸引用户的注意力。       实现这个效果,我能想到的方式大概有两种:1、继承一个LineLayout,在里面添加两个TextView,通过动画实现TextView的移动、显示、隐藏。2、继承TextView,手...

2016-03-03 00:41:33 7094 13

原创 Android弹幕效果实现

       在B站或者其他视频网站看视频时,常常会打开弹幕效果,边看节目边看大家的吐槽。弹幕看起来很有意思,今天我们就来实现一个简单的弹幕效果。       从直观上,弹幕效果就是在一个ViewGroup上增加一些View,然后让这些View移动起来。所以,整体的实现思路大概是这样的:1、定义一个RelativeLayout,在里面动态添加TextView。2、这些TextVie...

2016-02-25 15:08:42 14511 12

原创 Android Handler内存泄露分析

   用Lint工具对Android代码进行扫描时,有这样一个关于Handler的警告信息:This Handler class should be static or leaks might occur。    这个警告的产生是由于将Handler声明为了非静态内部类(匿名或非匿名),这种情况下可能会产生内存泄露,导致Activity无法释放。    我们使用Handler post...

2016-02-19 23:02:14 1498

原创 HttpClient的请求超时和响应超时

HttpClient是apache的开源实现,Android SDK中集成了HttpClient,项目开发中目前使用HttpClient来请求网络数据。在开发中碰到下面两个参数。CONNECTION_TIMEOUT = “http.connection.timeout”SO_TIMEOUT = “http.socket.timeout”这两个时间分别叫做请求超时和响应超时,之前对它们的...

2016-02-16 21:03:31 17180

原创 Android应用前后台切换的判断

       最近的项目有个需求,需要检测应用按Home键切到后台,以及点击桌面图标重新进入前台的状态。Android中没有提供一个应用前后台切换的回调或广播,这个功能只能我们自己来处理。以前遇到这个问题的处理方式是,实现一个BaseActivity,然后让其他所有Activity都继承自它,然后在生命周期函数中做相应的检测。具体检测方法如下:       在Activity的onStart和...

2016-01-19 19:08:28 29690 7

原创 Android Service更新UI的方法之Messenger

       上一篇文章我们讲解了怎样通过AIDL实现Service更新UI的功能,今天要讲的是另外一种方式:Messenger。它可以通过与Handler配合实现不同进程之间的通信,可以跨进程使用Handler发送消息。它的使用不像直接使用AIDL那么复杂,它只需要实现一个Handler对象来处理消息,其他的和使用普通的Service差不多。两个进程间可以通过Messenger来发送Messag...

2015-12-15 21:13:22 9012

原创 Android Service更新UI的方法之AIDL

       Service作为Android中的四大组件之一,它重要性不言而喻。它可以分为本地服务和远程服务:区分这两种服务就是看客户端和服务端是否在同一个进程中,本地服务是在同一进程中的,远程服务是在两个不同的应用中或者一个应用的不同进程。前面的文章中我们讲过怎样实现应用内多进程,看这里:http://blog.csdn.net/goodlixueyong/article/details/49...

2015-12-15 01:03:32 6011

原创 Fragment操作方法和生命周期的关系

        相信对Android开发比较熟悉的同学或多或少都用到过Fragment,Fragment附着在Activity上,有自己独特的生命周期。FragmentTransaction提供了很多操作Fragment的方法,如add()、replace()、attach()等,调用这些方法会触发Fragment不同的生命周期。调用了这些方法却不知道Fragment当前处于什么状态是...

2015-12-12 10:07:02 7853 3

Android监听前台和后台切换

实现Android监听前台和后台切换的demo

2016-01-19

通过Messenger实现Android Service更新UI

通过Messenger实现Android Service更新UI

2015-12-15

AIDL方式实现Service更新UI的功能

AIDL方式实现Service更新UI的功能

2015-12-15

Android应用内多进程例子

Android实现应用内多进程例子,演示了设置process属性实现多进程时会遇到的问题.zip

2015-11-16

空空如也

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

TA关注的人

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