8 崩豆

尚未进行身份认证

暂无相关简介

等级
TA的排名 6w+

记一次诡异的OOM坑

OOM,即OutOfMemory。作为Android设备常见的性能问题,经常见于图片大量加载的场景。然而博主这次碰到的OOM,却是由一个意想不到又合情合理的问题导致。由于是半路接手一个正在开发的项目,着实被坑了一把。一.场景描述:在一个Activity中,会异步生成一张二维码图片。不过这个功能显然是后来匆忙加的,因为二维码Bitmap并没有缓存(项目其它地方的图片都是用Glide)...

2018-07-09 10:23:35

Android启动性能优化

一.了解APP启动内部机制1.1三种启动方式:cold,warm,hot冷启动:app将从头开始启动暖启动热启动暖启动和热启动,系统将一个正在运行的app从后台转为前台。我们强烈推荐直接优化冷启动。因为这些优化措施同样可以提高暖启动和热启动的性能。1.2冷启动过程相比其它启动方式,优化冷启动并不容易。因为相比其它两种方式,系统和app显然有更多的工作要...

2018-06-26 00:05:57

leetcode之旅-无重复字符的最大子串长度

一.题目描述Givenastring,findthelengthofthelongestsubstringwithoutrepeatingcharacters.-Examples:-Given“abcabcbb”,theansweris“abc”,whichthelengthis3.-Given“bbbbb”,...

2018-06-24 04:26:27

ProtocolBuffer使用入门

一.获取ProtocolBuffer1.1获得源码Github:ProtocolBuffer源码Gitclone之:gitclonehttps://github.com/google/protobuf.git或者直接下载release版本:https://github.com/google/protobuf/releases本例选择从release下载3.5.1版...

2018-06-17 17:49:50

Android屏幕兼容性概览

前言:这篇文章内容主要来自于Google的官方指导,有些地方加入笔者自己的理解。有很多内容现在应用的已经很少了,比如ldpi屏幕。现在android设备的分辨率越来越高,尺寸也接近于同一,适配难度也低了很多。Google在过去不断推出了新的View组件、容器组件。个人建议尽量使用新的组件来实现UI,它们往往性能更好,风格和样式趋近于MD的统一风格,而且更易于适配不同的屏幕。但笔者仍...

2018-06-13 02:31:52

Android降低UI渲染速度的检测、诊断及修复

一.Slowrendering-jank为了保证UI交互的流畅,必须保证每帧的渲染时间不超过16毫秒,保证60的FPS。一旦界面有较慢的渲染,系统将强制跳帧,用户就会感觉到卡顿。Wecallthisjank.二.定位jank1.三种定位方法想要准确定位发生jank的代码并不容易,以下三个办法可以帮助开发者:-视觉检查:可以快速直观的发现jan...

2018-06-12 00:16:33

ANR问题的检测、诊断及修复

一.ANR简介描述:UI线程如果停止响应太长的时间,“ApplicationNotResponding”(ANR)就被触发。如果被阻塞的app处于前台,系统会显示一个ANR对话框。触发:以下两个条件,任意各一个都会导致ANR当app处于前台时,在5s内无法相应用户输入或广播。当app没有activity处于前台时,广播接收器正在进行长时间的任务,且无法结束。...

2018-05-30 02:37:02

Android Vitals各性能指标介绍

Androidvitals简介谷歌推荐使用Androidvitals来帮助开发者提高App的稳定性和性能表现。作为这个方案的一部分,PlayConsole提供了AndroidVitalsdashboard的早期测试版本。当被选中的用户运行App时,设备会记录大量的测试指标数据,包括app稳定性、渲染时间和电池使用数据。PlayConsole统计这些数据并在dashboar...

2018-05-30 02:35:09

Activity的工作过程(二)

Activity启动详细流程(下)四.新进程启动ActivityThreadZygote进程孵化出新的应用进程后,会执行ActivityThread类的main方法。在该方法里会先准备好Looper和消息队列,然后调用attach方法将应用进程绑定到ActivityManagerService。然后进入loop循环,不断地读取消息队列里的消息,并分发消息。//Activ...

2018-05-28 01:21:07

Activity的工作过程(一)

一.Activity调用ActivityManagerService启动应用用户在Launcher程序里点击应用图标时,会通知ActivityManagerService启动应用的入口ActivityActivityManagerService发现这个应用还未启动,则会通知Zygote进程孵化出应用进程,然后在这个dalvik应用进程里执行ActivityThread的main方法。...

2018-05-28 01:20:25

Android消息机制原理

一.概述:Handler、消息队列和LooperHandler的功能:将一个任务切换到某个指定的线程中去执行。UI线程:Handler常见于从工作线程切换到UI线程。因为AndroidUI使用的是单线程模式,不允许在其它子线程中访问UI。如果在多线程中并发访问UI,可能导致UI控件处于不可控的状态,它不是线程安全的。工作流程:Thread2中创建Handler对象,Handl...

2018-05-10 17:00:09

View的工作原理(四):自定義View

一.自定义普通View这个小节我们来看看如何自定义一个继承自View的控件。目标:自定义一个圆形控件:publicclassMyCircleViewextendsView{privateintmColor=Color.GREEN;privatePaintmPaint;publicMyCircleView(Context...

2018-05-07 23:53:20

View的工作原理(三):layout与draw

一.layout过程先来看看View的layout方法源码:publicvoidlayout(intl,intt,intr,intb){if((mPrivateFlags3&PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT)!=0){onMeasure(mOldWidthMeasureSpec,...

2018-05-06 01:54:03

View的工作原理(二):measure

本文主要描述measure过程。一.View的measure过程View的measure方法为final,该方法中会调用View的onMeasure方法。下面是onMeasure方法:protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){setMeasuredDimension...

2018-05-05 17:57:55

View的工作原理(一):MeasureSpec

ViewRoot和DecorViewView的绘制流程是从ViewRoot的performTraversals方法开始的。它经过measure、layout和draw三个过程才能最终将一个View绘制出来。measure:测量View的宽和高layout:确定View在父容器的位置draw:将View绘制在屏幕上。performTraversals的工作流程:父容器在o...

2018-05-05 02:18:03

View的事件体系三(滑动冲突处理)

本文讨论滑动冲突问题。在界面中只要有内外两层同时可以滑动,就可能会产生滑动冲突。一.滑动冲突场景外部滑动方向和内部滑动方向不一致。举个例子,ViewPager和Fragment配合组成的页面滑动效果。左右滑动可以切换页面,如果页面内又是一个ListView,就会导致滑动冲突,只不过ViewPager内部已经处理了这种滑动冲突,所以我们无需担心这个问题。但是如果我们使...

2018-04-27 02:28:00

View的事件体系二(事件分发)

一.传递规则MotionEvent的分发主要由下面三个方法来完成:publicbooleandispatchTouchEvent(MotionEventev)对于一个根ViewGroup,点击时间产生后,会首先调用这个方法。它将根据onInterceptTouchEvent的返回值,来决定是否对子View继续分发。publicbooleanonInterceptTo...

2018-04-26 01:17:52

View的事件体系一(触摸、手势、滑动)

一.View基础触摸、手势、滑动事件View是所有界面层的空间的一种抽象。Andorid屏幕坐标系原点在左上角,而View的left,right,top,bottom属性,都是相对于其父View的坐标。1.MotionEvent和TouchSlopMotionEvent手指触摸屏幕后,典型的事件类型:ACTION_DOWN:手指刚接触屏幕;ACTIO...

2018-04-24 16:48:17

Android跨进程通信-IPC初探(三) - 使用AIDL

IPC初探(三)-使用AIDL本文将会介绍AIDL通信。本系列的其它文章:Android跨进程通信-IPC初探(一)Android跨进程通信-IPC初探(二)-使用Messenger1.示例的新需求回顾一下在IPC初探(一)中的示例,服务端为客户端提供了两个功能:addStudent():在客户端为服务端的List添加新的数据getStud...

2018-04-23 12:37:34

Android跨进程通信-IPC初探(二) - 使用Messenger

IPC初探(二)本文将会介绍Messenger通信。Mesenger是一种轻量级的IPC方案。它通过传递Message来实现数据的进程间传递。它的底层实现是AIDL。Messenger工作原理:需求描述:C端向S端跨进程发送msg,并封装一个bundle数据对象S接收msg,读取bundler数据,并向C端返回一条新的msg,并封装一个新的bundlB数据对象...

2018-04-22 02:12:35

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!