fpsviewer一个能实时显示fps,一段时间的平均帧率,以及帧率范围占比,并能获取卡顿堆栈的可视化工具。侵入性低,通过在异步线程采样获取堆栈,无代码侵入,性能消耗可忽略,对性能监控项的异常数据进行采集和分析,整理输出展示相应的堆栈,从而帮助开发者开发出更高质量的应用。

常见分析、定位卡顿的方案

系统工具

1. TraceView

目前一般是用现在AndroidStudio里的cpu-profile工具或者TraceCompat.beginSection()生成trace日志,
准确性高,这种分析方式只适合定性分析,因为工具很消耗cpu,有很多假jank,非常影响性能,显示耗时和实际耗时偏差很大,平常开发过程中也不易用,不可能实时开着,没法查看fps。
阅读全文

Android的业务开发中。列表需求很很常见也很重要的部分,列表承载的信息多,涉及的的协议多,布局也多,尤其一些复杂的列表,不管是用ListView还是RecyclerView,使用不当会带来很多的性能问题和后期的维护问题,形成一套规范的,高性能的列表开发模式很有必要。

案例分析

用一些案例说明一下吧(只是用一些App里的截图来做类比,并不知其协议类型和实现方式)

类似的列表不容易解决的主要在两个方面:

  1. 先不管列表里每个Item的具体UI,首先列表是可通过下拉刷新和广播通知变化,数据应该也只能全量下发,更新频率可能特别高,列表的长度也可能很长比如几百条(一些聊天列表或者在线用户列表可能存在数据量更大的情况),如果过高频率的刷新很容易造成页面卡顿。 阅读全文

目前的问题

Handler的使用在Android日常开发中占用很大的比重,尤其在界面开发中,经常被用来做一些延迟执行的任务。但Handler带来的问题也很多,最常见的比如页面退出未执行的任务没有被移除导致内存泄漏,以及可能的由于界面已不存在而导致的崩溃。如下,如果不及时移除就可能造成上述问题。

1
2
3
4
5
6
mHander.postDelayed(new Runnable() {
@Override
public void run() {
//do something
}
},1000);

这些问题一般都比较容易想到,也容易解决,常用的方式是缓存一个Runnable变量在使用的类中,然后在页面生命周期结束移除

阅读全文

Hub库的由来

在准备重构知天气时,决定使用谷歌推出的
Android Architecture Components架构,同时借鉴微信Android模块化架构重构实践的模块化的思想,抛弃之前的MVP,单一模块的方式对项目进行重构,同时积累一些经验来对工作中的项目进行优化。AAC和模块化的优点就不多介绍了,AAC很容易引入,谷歌在Android的API层面提供了大量的支持,模块化主要的难点就是模块间没有直接引用,如何通信的问题(以下用module来代替模块,也就是Android开发中的nodule),了解到的有主要以下几种思想:

阅读全文

并发的学习与使用系列 第八篇

AQS是AbstractQueuedSynchronizer的简称,是并发组件包java.util.concurrent也就是JUC(Java Util Concurrency)的核心,以及很多并发组件如前面几篇中介绍到的ReentrantLock,Condition,BlockingQueue以及线程池里使用的worker等都是基于其实现的,将很多复杂的,繁琐的并发控制过程封装起来,便于其他并发工具类来实现更多,方便的功能,其主要通过volatile和UnSafe类的原子操作(Atomic相关)来实现阻塞和同步,之前的文章并发的学习与使用系列提到里Lock的实现类ReentrantLock是一个可重入的,可实现公平的锁。下面通过ReentrantLock的源码来看看其是怎么实现的。

阅读全文

关于Java GC的理解

发布在 JVM

关于Java垃圾回收机制,网上介绍的资料很多,一般都是一些固定的知识,这些在书上都能找到相应的出处,这里希望讲一些更加细节的问题。如果你对Java虚拟机的知识不了解,建议先去了解一下,这里都是一些概念上的理解,主要基于HotSpot虚拟机。

阅读全文

该项目已经重构,see KnowWeather

已经有那么多的天气应用了,这个项目有什么不一样的地方吗?为什么还要做这个项目呢?

  • 第一个目的是熟悉项目从0到上线的过程,平常的工作中大部分是在做很小部分的业务开发,对项目的整体框架没机会实践。
  • 熟悉新的框架和技术,先进行应用,感受其优缺点,然后应用到工工作中,因为很多新技术学习是需要时间的,而且其特性也是需要提前了解的,在未了解的情况直接用到公司的项目会花费时间并且可能会带来风险。
阅读全文

Dalvik虚拟机如同其他Java虚拟机一样,在运行程序时首先需要将对应的类加载到内存中。而在Java标准的虚拟机中,类加载可以从class文件中读取,也可以是其他形式的二进制流。因此,我们常常利用这一点,在程序运行时手动加载Class,从而达到代码动态加载执行的目的。
只不过Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物,传统Class文件是一个Java源码文件会生成一个.class文件,而Android是把所有Class文件进行合并,优化,然后生成一个最终的class.dex,目的是把不同class文件重复的东西只需保留一份,如果我们的Android应用不进行分dex处理,最后一个应用的apk只会有一个dex文件。

阅读全文

在学习Android过程中,会使用到很多开源框架,而使用时对框架的实现方式应有一定的了解,这个过程最好的方式就是阅读源码,毕竟源码说明一切。但开源框架很多,不时会有新的出现,而且对一些通用框架来说,一般代码量非常庞大,所以正确的阅读姿势很重要。一般来说有下面几个要点:

  • 明确阅读源码的目的是对整体有个了解而非细节,对开源框架来说就是先找这个框架的特点,其他相同业务框架相比的优点和不足,这也是选择的考虑的重点;
  • 厘清一个框架的核心点和辅助点;
  • 最重要的是总结相似框架的架构模式与习惯,慢慢的就会有一套自己的阅读套路。

这里主要通过常用的网络请求库OkHttp,图片加载库Picasso,事件总线库EventBus等对上面提到的几点进行解读。

阅读全文

SilenceDut

talk is cheap,here are my blog


Android engineer


广东,广州