首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 移动应用性能优化 之 友盟

:   这个项目利用工作之余休息时间陆陆续续写完了,写过程中不断在完善修改,也会听取读者建议增加相应功能,这个过程中也遇到了一些问题,例如:ANR(程序无响应)、NullPointerException...NullPointerException   NullPointerException(空指针异常),相信用Java写Android朋友肯定遇到过找个问题,那就是null,常说空对象。...这里有一个预初始化一个正式初始化,预初始化在程序第一次安装运行时使用。...我们可以通过缓存去做处理,比如下图所示: 这里通过缓存方式判断用户是否有同意隐私政策,第一次进来肯定是没有同意,因此会走else,而我们在同意隐私政策时候再进行一次正式初始化就可以了...点击左边蓝色报错处   这里告诉你报错具体代码行,以及下方这里有你报错设备信息,方便你去排查原因,再往下看。   这里告诉你报错原因是什么

39210

Java编程规范-缺陷预防

1、异常处理中一般情况下遵循 " 早抛出 , 晚捕获 " 规则; 2、不要主动 捕获 运行时 异常 RuntimeException ; 3、对于非运行时异常,如果不处理,需要用日志记录; 示例...byteArray = byteSet.toArray(new Byte[byteSet.size()]); 7调试信息 7.1日志记录 1 ....使用 门面模式 日志框架,有利于 系统维护 各个类 日志处理 方式 统一 ; 示例: 【 错误用法】 public class DemoTest { ......对 trace/debug/info 级别的日志输出,必须使用条件输出形式 或者 使用占位符方式。...这是 因为如果在在日志中有字符串拼接动作,即使日志没有打印数据,也会执行 字符串 拼接 操作 ,如果 日志 中有对象,会执行对象 toString() 方法 ,浪费 了 系统资源 , 执行了上述 操作

48720
您找到你想要的搜索结果了吗?
是的
没有找到

Intent传递数据全解

概述 之前博文也有介绍,查看—->用户界面开发基础 这里单独抽取出来,更加详细记录一下,其实主要是API使用。 ---- Intent传递简单数据 ?...Studio生成Parcleable插件: Intellij/Andriod Studio插件android-parcelable-intellij-plugin 只要ALT+Insert,即可直接生成...另外:Android中大量用到Parcelable对象,实现Parcable接口又是非常繁琐,可以用到 第三方开源框架:Parceler 可参考AndroidParcelable自动生成 两种序列化方式比较...3)Parcelable不能使用在要将数据存储在磁盘上情况,因为Parcelable不能很好保证数据 持续性在外界有变化情况下。...这个时候,我们重新 打开这个app,这个时候很神奇,回到了Activity2页面,但是如果这个时候你再去获取Application 里用户账号,程序就会报NullPointerException

86240

解读 美团外卖Android Crash治理之路

NullPointerException NullPointerException是我们遇到最频繁,造成这种Crash一般有两种情况: 对象本身没有进行初始化就进行操作。...针对第一种情况导致原因有很多,可能是开发人员失误、API返回数据解析异常、进程被杀死后静态变量没初始化导致,我们可以做有: 对可能为空对象做判空处理。...因为发生时Crash堆栈信息往往不是导致问题根本原因,而只是压死骆驼最后一根稻草。 导致OOM原因大部分如下: 内存泄漏,大量无用对象没有被及时回收导致后续申请内存失败。...离线日志顾名思义,内容都是预先记录,有时候可能会漏掉一些关键信息,因为在代码中加日志一般只是在业务关键点,在大量普通方法中不可能都加上日志。...我们可以改造Holmes使其支持批量甚至全量下发动态日志记录日志等到发生特定类型Crash时才上报,这样一来可以减少日志服务器压力,同时也可以极大提高定位问题效率,因为我们可以确定上报日志设备最后都真正发生了该类型

1K20

java一维数组、二维数组初始化

大家好,又见面了,是你们朋友全栈君。...; a[0] = 1; a[1] = 2; //错误,因为数组没有初始化,不能直接赋值 二维数组声明: int[][] a; //只声明数组a,没有初始化 int[][] a = new...数组一旦被声明,容量就固定了,不容改变。...动态初始化:数组定义与为数组分配空间赋值操作分开进行(静态初始化是在声明数组同时进行辅助,动态初始化是在先声明数组,然后再对其进行赋值) 静态初始化:在定义数组同时就为数组元素分配空间并赋值(静态初始化是在声明数组同时进行辅助...,动态初始化是在先声明数组,然后再对其进行赋值) 默认初始化:数组是引用类型,元素相当于类成员变量,因此数组分配空间后,每个元素也被按照成员变量规则被默认初始化 静态初始化 int intArray

60720

React-Native android在windows下踩坑记

你需要先安装最新版本node.js(最后使用是v4.1.2),前往官网下载>> 注:win7已经安装过Visual Studio 2013Android开发环境(也踩了不少坑,后面有截图...尝试下载并安装Android Studio。...-2-0-start-up-error-java-lang-nullpointerexception 最后启动Android Studio后,打开SDK Manager,设置镜像后,下载安装指定SDK...遇到问题跟我之前安装环境有问题,所以导致了一些问题,祝诸君都能顺利看到Welcome to React Native!...贴几个本机环境: ANDROID_HOME 出错提示已经很明确告知了,其实就是AndroidSDK根目录,不行你就安装Android Studio里面就帮你下载好了SDK,里面包含

1.8K30

美团外卖Android Crash治理之路

NullPointerException NullPointerException是我们遇到最频繁,造成这种Crash一般有两种情况: 对象本身没有进行初始化就进行操作。...针对第一种情况导致原因有很多,可能是开发人员失误、API返回数据解析异常、进程被杀死后静态变量没初始化导致,我们可以做有: 对可能为空对象做判空处理。...因为发生时Crash堆栈信息往往不是导致问题根本原因,而只是压死骆驼最后一根稻草。导致OOM原因大部分如下: 内存泄漏,大量无用对象没有被及时回收导致后续申请内存失败。...离线日志顾名思义,内容都是预先记录,有时候可能会漏掉一些关键信息,因为在代码中加日志一般只是在业务关键点,在大量普通方法中不可能都加上日志。...我们可以改造Holmes使其支持批量甚至全量下发动态日志记录日志等到发生特定类型Crash时才上报,这样一来可以减少日志服务器压力,同时也可以极大提高定位问题效率,因为我们可以确定上报日志设备最后都真正发生了该类型

1.2K30

Android 移动应用性能优化 之 友盟

:   这个项目利用工作之余休息时间陆陆续续写完了,写过程中不断在完善修改,也会听取读者建议增加相应功能,这个过程中也遇到了一些问题,例如:ANR(程序无响应)、NullPointerException...NullPointerException   NullPointerException(空指针异常),相信用Java写Android朋友肯定遇到过找个问题,那就是null,常说空对象。...所以使用Java开发Android时候要特别注意这一点,注意null。这一点Kotlin就做很好,因为空安全这个特性。...点击左边蓝色报错处   这里告诉你报错具体代码行,以及下方这里有你报错设备信息,方便你去排查原因,再往下看。   这里告诉你报错原因是什么?...主线程睡眠时间过长,导致线程阻塞,程序无响应,ANR。   这里右边行为日志,也很不错,可以让你知道你在当前这个页面是在做什么。

56330

Android最佳性能实践(二)——分析内存使用情况

那么这是使用dalvik运行环境时所打印GC日志,而自Android 4.4版本之后加入了art运行环境,在art中打印GC日志基本dalvik是相同,如下图所示: ?...这个工具分为Eclipse插件版独立版两种,如果你是使用Eclipse开发,那么可以使用插件版MAT,非常方便。如果你是使用Android Studio开发,那么就只能使用独立版MAT了。...通过这种方式,我们就成功地将内存泄漏原因找出来了。这是Dominator Tree中比较常用一种分析方式,即搜索大内存对象通向GC Roots路径,因为内存占用越高对象越值得怀疑。...当然其实也可以用Dominator Tree中比较相似的方式,即分析大内存对象,比如上图中byte[]对象内存占用很高,我们通过分析byte[],最终也是能找到内存泄漏所在,但是这里准备使用另外一种更适合...可以看到,我们再次找到了内存泄漏原因,是因为MainActivity$LeakClass对象所导致

1.5K60

读书笔记--Android Gradle权威指南(上)前言笔记

由于 Gradle 更新换代特别快,而且新大版本经常都会提供很多新特性,这就导致了在 clone Github 上一些开源项目到本地构建时经常有报错问题,本质原因就是因为使用 Gradle 版本跟你本地不一样...,而由于有堵巨墙原因导致一直没法成功下载配置 Gradle 版本,进而就无法构建项目,而报错了。...因为这个项目用到了你本地没有的 Gradle 版本,所以 Android Studio 自动去下载了,但由于都懂原因,下载速度贼慢,因此网上才有一些博客教你说让你要去访问外国网站,明白为什么了吧。...,那么这时脚本文件也就派上用场了: gradle命令带参数示例.png gradle命令异常栈.png 这样一来就可以看到更多日志信息了,当然这个例子不好,因为可以直接看出问题出在哪了...你查了下原因,网上有教程说,让你将项目中 gradle/wrapper 文件里 Gradle 版本换成你本地项目中 Gradle 版本,还跟你说因为使用版本你本地没有,而且被墙了,你下载需要很长时间

1.2K40

android 伸缩控件ExpandableListView 展开失败可能原因

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)  作用是让我们返回一级目录...然后就屁颠屁颠地回去找bug,代码确定没错,于是加入了很多log,再次运行,查看日志勒个去!...查看之后,实在找不出它有错理由,于是乎,就找之前成功过例子 xml 文件替换进去,运行,点击,还是不行,当时就fuck 了 dog 了。...然后就开始 把原来不行 布局文件 替换后可以来对比。控件类型对比差异:不行布局文件带有 button 控件,可以没有带有button,其它地方一样。...再看看 button 宽和高,即有效点击范围,都是 wrap,按道理没占满整个父view,点其他地方,不就是没点到吗。可事实就是如此。

81980

C#移动跨平台开发(1)环境准备

因为原因没有学习过JavaObject C,但是看着这大好前景也忍不住蠢蠢欲动啊!...盗一张Xamarin.com首页图,激动一下人心 —— 我们知道一定有一种更好方式来开发移动应用程序!    今天第一篇,我们先来配置一下开发环境,分为一步傻瓜自动化式自虐手动配置式。...在@gjun提醒下,总算找到了为什么向导式安装(XamarinInstaller.exe)安装会失败了,原来也是因为“墙”原因。...然后创建一个Android 4.0 模拟器。 之后,启动,这个过程有点儿慢。 等初始化完了之后,我们Android4.0就出来了。...由于初始化过程比较慢,所以我们可以保持一直开着。

1.9K70

Android性能优化(一)

系统日志统计 也可以根据系统日志来统计启动耗时,在Android Studio中查找已用时间,必须在logcat视图中禁用过滤器(No Filters)。因为这个是系统日志输出,而不是应用程序。...怎样找到更多 “证人” “线索” ? “侦查案件” 一般流程是什么? 对不同类型 “案件” 分别应该使用什么样调查方式? 要相信 “真相永远只有一个”,崩溃也并不可怕。...比较常见是有 SIGSEGV SIGABRT,前者一般是由于空指针、非法指针造成,后者主要因为 ANR 调用 abort() 退出所导致。 ANR。先看看主线程堆栈,是否是因为锁等待导致。...“只要能本地复现,就能解”,相信这是很多开发跟测试说过的话。有这样底气主要是因为在稳定复现路径上面,我们可以采用增加日志或使用 Debugger、GDB 等各种各样手段或工具做进一步分析。...虽然崩溃日志可能没有我们自己代码,但通过操作路径日志,可以找到一些怀疑点。 尝试规避。查看可疑代码调用,是否使用了不恰当 API,是否可以更换其他实现方式规避。 Hook 解决。

2.5K20

Android Studio常用技巧汇总

默认是在启动时显示,但是很多开发者都不会让启动时显示,实际上这里才是Android Studio技巧集萃,里面都是非常实用使用技巧,每天抽一点时间,简单看下这个Tips,用不了多久这些带给你时间收益...NullPointerException,那么在程序时不需要设置任何断点,只要App因为NullPointerException异常而导致崩溃,系统就会在对应地方自动断点并暂停 日志断点 开发者经常会遇到这样情况...,整个工程代码已经写完了,突然出现了一个bug需要加一行Log进行调试,因为这一行Log要把整个工程都编译一遍,这是非常痛苦事,而实际上,Android Studio已经提供了针对这个问题解决方案...win快捷方式ctrl + 空格(win同样大部分输入法冲突, 请手动在AS设置里面keymap项查找completion basic手动修改快捷键) 快速生成变量 比如在方法体中logi...Studio中,系统给开发者提供了默认方法注释模板在方法名上一行输”/**”,再按Enter键确认,即可获取方法注释代码 但Android一样,Android Studio也提供了强大自定义功能

2.5K30

Android Git之旅

更新代码方式是什么?你还在用拷贝方式保存代码吗?U盘?移动硬盘?还是网盘? 正文   以上一些方式你可能在刚开始学习或工作时候会用到,但不是长久之计,因此你需要学会使用git。...初始化一个空git仓库,此时你会发现你项目的文件夹下多了一个.git文件夹。 它是一个隐藏文件,如果看不到,就需要设置一下查看方式。 ② git add ....经过百度了解之后,预测是远程仓库里面的README.md文件导致,我们这样提交代码,可能会导致丢失。这个颜色字体是警告,我们无视,执行。...百度上说是因为本地当前分支没有远端分支进行相关联。但是之前明明关联了,那么这又是闹哪样呢? 难道是改了本地分支名原因吗?   这里其实还有一句话,告诉我们需要关联执行下面这一行指令。...莫慌,再尝试别的方式。 ⑧ git pull   刚才我们一直是提交,但是因为远程仓库里面有一个README.md导致本地库远程库有差异,所以我们反向操作一下,先把远程库内容拉取到本地,试试看。

67910

深入研究Android启动速度优化(上)- 看完这些启动优化已经完成80%了

启动耗时统计八种方式 Displayed 在 Android 4.4(API 级别 19)及更高版本中,在 Android Studio Logcat 中过滤关键Displayed,可以看到对应冷启动耗时日志值...reportFullyDrawn 当我们在使用异步方式来加载数据,这会导致一个问题就是应用画面已经显示,同时 Displayed 日志已经打印,可是内容却还在加载中。...AOP使用场景 无痕埋点:分离业务代码统计代码; 安全控制:比如全局登录状态流程控制; 日志记录:侵入性更低更有利于管控日志系统; 事件防抖:防止View被连续点击触发多次事件; 性能统计:检测方法耗时...CPU Profiler 另一种方式就是使用 Android Studio3.2 或更高版本,通过 CPU Profiler 来查看 App 启动时间: 在 Android Studio 工具中选择...优缺点 Systrace 性能开销非常低,因为只会在我们埋点区间进行数据追踪记录。而 Traceview 是会把所有的线程堆栈调用情况都记录下来。

70411

app自动化面试题

通知可以用很多种方式来吸引用户注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久图标,用户可以打开并获取消息。...好处:统一数据访问方式。 Service服务:是Android中实现程序后台运行解决方案,非常适合去执行那些不需要和用户交互而且还要长期运行任务(一边打电话,后台挂着QQ)。...) 6 app出现ANR,是什么原因导致?...20 如何fiddler实现弱网原理? Fiddler限速是以网络延迟方式实现,网络延迟时间*网速=传输字节数。...用工具adb logcat 经常会把日志用重定向方式写到一个文件夹中: >D:\log.txt 在具体使用时会对日志进行等级筛选过滤,比如: *:E(E是等级error) 为方便定位日志,可以显示日志记录时间

1.4K20

Android开发高手课NOTE

即使是最新华为 Mate 20,最大 Java 堆限制也才到 512MB,可能物理内存还有 5GB,但是应用还是会因为 Java 堆内存不足导致 OOM。...处于不同 Activity 状态时,在您应用与另一个应用之间切换(导航到主屏幕,然后返回到您应用)。 ANR 经验是,先看看主线程堆栈,是否是因为锁等待导致。...另外一方面因为序列化文件需要包含信息非常多,导致大小比 Class 文件本身还要大很多,这样又会导致 I/O 读写上性能问题 Parcel 序列化 Java Serializable 序列化差别还是比较大...因为用户最容易感知这个,明明没有怎么打开,为什么耗这么多?在后台不要做这些:长时间获取 WakeLock(及时释放)、WiFi 蓝牙扫描、GPS、video、audio ?...俩种方式上报日志:push上报,主动上报(在用户出现奔溃,反馈问题时主动上报日志(可以重启了上报)) 正因为反复“痛过”,才会有了微信用户日志点击流平台,才会有美团 Logan Homles(

85930

Java Web 面试中关于Spring MVC必问题,不收藏血亏!

提供了模型 - 视图 - 控制器架构,可用于开发灵活Web应用程序。在本教程中,我们将重点关注与之相关问题,因为通常是Spring开发人员面试热点问题。强烈建议收藏!...ViewResolver解析后返回具体View; 10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中) 11. DispatcherServlet响应用户。...一旦出现在模型中,我们应该填充所有具有匹配名称请求参数参数字段。 Q @Controller@RestController之间有什么区别?...例如 从/user/123提取值123给/user/{id}控制器来获取一个id=123数据映射关系。需要特别指出是通过此注解获取值不会被编码。具体可通过文章来获取原因。...拦截器切面处理一些公共逻辑而避免重复处理程序代码(如日志记录),也可以用来更改Spring模型中全局使用参数。

1.7K10
领券