Android-Tips(实用Android开发技巧)

整理本人实际开发中遇到的一些问题以及解决办法和一些开发技巧,以后会不定时更新。

tips:利用“目录”可快速导航

1.追溯sdk中某一个类随sdk版本升高导致的历史变迁。(find API changes)

问题来源:SwipeRefreshLayout源码:判断子View是否能向上滚动(或者是否滚动到顶部):

    /**
     * @return Whether it is possible for the child view of this layout to
     *         scroll up. Override this if the child view is a custom view.
     */
    public boolean canChildScrollUp() {
        if (android.os.Build.VERSION.SDK_INT < 14) {
            if (mTarget instanceof AbsListView) {
                final AbsListView absListView = (AbsListView) mTarget;
                return absListView.getChildCount() > 0
                        && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
                                .getTop() < absListView.getPaddingTop());
            } else {
                return ViewCompat.canScrollVertically(mTarget, -1) || mTarget.getScrollY() > 0;
            }
        } else {
            return ViewCompat.canScrollVertically(mTarget, -1);
        }
    }

进入Android开发官网,假如要查看View API的变化,输入View,选择android.view.View,如图:

进入View的API参考页面(文档页),如图:

从图中可以看到三个主要信息:

  • View是在API level 1添加的
  • View的类层次
  • 通过左侧的API level choose button 可以查看不同API level下的View API,进行纵向的查看,同时可以将不同API level下的View API进行横向对比。

追溯API 变化就是通过上述第三条实现的。比如我们想看看API level 13和 API level 14之间有什么变化,将左侧API level设置为13,查看方法列表:

我们会发现一些API 是灰色的,当鼠标hover过方法名时,会显示出一个提示,如图:

这个提示告诉我们:View中的canScrollVertically(int direction) 方法是在API level 14以后才添加的,另外canScrollHorizontally(int direction) 也是API level 14以后才添加的方法。当我把API level 切换到14时,发现上述两个方法的颜色变为蓝色了,说明他们的确是在API level 14添加的:

总结:

使用这种方法的好处是不用下载每一个api 版本的源代码,也可以很方便的对比他们之间的变化。开发参考除了可以对比方法的变化以外,还可以对比内部类,接口等变化,当前选中的API level 为9,结果如图:

2.使用device monitor 中的method profiling 工具寻找app卡顿的元凶

问题来源:使用RxJava时,出现莫名的卡顿,方法嵌套过深,或类关系过于复杂,难以定位问题。

进入sdk->tools文件夹。双击运行monitor.bat 打开device monitor:

左侧Device tab下是当前的设备名以及待调试应用的包名。在要测试某个操作(方法调用)之前,点击method profiling 按钮,弹出对话框:

输入采样间隔:

输入采样间隔,间隔越大,采集到某个方法调用栈的可能性就越小,可能漏掉某个调用栈,越小,采样精度越高(或者说覆盖率越高)但是采样间隔太小,会导致卡顿。所以需要输入一个合适的采样间隔。输入后点确认,然后在app上执行你的操作,执行完后点stop method profiling,会生成一个名为“ddms+时间戳+.trace”的文件,这个文件记录了方法的调用栈信息,这个文件是我们分析的重点:

视图中上一栏,展示了在method profile过程中并行执行的所有线程或进程。下一栏的表格展示了方法的调用信息,如方法名,所耗时间,cpu占用等。可参考:http://blog.csdn.net/androiddevelop/article/details/8223805

表格中相关列名的说明:

点击表格每一栏的名字可以进行排序,根据Name找到上述操作调用的方法,如fetchData:

Parents值得是fetchData的调用入口,而Children指的是fetchData方法中的子调用。

可以看出每个子调用或父调用的耗时情况,可以看出fetchData中的子调用fetchDataImpl耗时22.777ms,继续点击fetchDataImpl可以进入fetchDataImpl的调用栈,分析方式就同fetchData了,通过这种方式可以定位耗时操作的源头:

总结:

使用method profiling可以分析方法的调用栈,找出app的性能瓶颈。android device monitor的功能很强大,是一个工具的合集,还可以分析Heap Dump,Allocation,Network,查看Device的文件等。好的工具可以提升开发效率,科学使用工具可以事半功倍。另外推荐一款在线APP 冷启动性能分析工具:Nimbledroid 可以分析APP 冷启动的调用栈,通过他可以优化APP的启动速度,并能通过学习别的app加快启动速度的方式,提高自己app的启动速度。

以后会不定时更新,未完待续。

时间: 2024-10-09 21:30:58

Android-Tips(实用Android开发技巧)的相关文章

angularJS实用的开发技巧

一.开端 真的是忙完这一阵子就可以忙下一阵子了啊... 最近在做一个angularJS+Ionic的移动端项目...记录一些技巧,方便自己以后查阅,也方便需要的人可以看一看...^_^ 二.基础原则了解 ①angular的一些入门了解 一.基础知识 1.angular放弃了IE8 2.四大核心分别是mvc.模块化.指令系统.双向数据绑定 二.一些原则 1.不要复用controller,一个控制器一般只负责一小块视图. 2.不要在controller里面操作dom. 3.不要在contorller

iOS 完整项目集合 精选好看炫酷的动画DEMO 实用的开发技巧

Dear all:一周一weekly又来啦~很多code友反应weekly精品干货,非常好,非常多哦,建议各位code友如果现在暂时用不到,可以先做收藏哦,以后查用起来也方便哈~不多说进入正题 <ignore_js_op> [一周精品源码] LMLiveStreaming 直播框架[img]file:///C:\Users\zhangjy\AppData\Roaming\Tencent\QQ\Temp\[email protected][GWU0353$FOVS.png[/img]http:/

实用的开发技巧总结

最近写业务代码的时候遇到个问题:如何进行两组数据的匹配?首先想到的就是嵌套双重循环(我这里是两组数组),但是双重循环性能是很低的.这里我尝试两种方法做个数组去重处理. var oldArr = [{ id: 1, name: 'value1' }, { id: 2, name: 'value2' }, { id: 3, name: 'value3' }, { id: 4, name: 'value3' }, { id: 5, name: 'value5' } ], newArr = [], ma

Android 开发技巧总结(三)

1.在界面中按返回键判断某个控件的可见性,如果可见,则用动画让其消失,应用并不退出. Onkeydown方法中: if(keyCode == 4){ if(slidingMenu.getVisibility() == View.VISIBLE){ //退出的动画 AnimationSet animationSet = new AnimationSet(true); TranslateAnimation animation = new TranslateAnimation(0,-280, 0, 0

50个Android开发技巧(10 为TextView加入样式)

首先来看一个控件的例子: (原文地址:http://blog.csdn.net/vector_yi/article/details/24428085) 手机上类似这种场景你一定已经见过非常多次了,但有没有考虑过它是如何实现的? 或许你会觉得这是一个略微复杂的自己定义的View,但,没错,这实际上仅仅是一个原生的TextView而已. TextView是一个简单而奇妙的Widget,你能够利用它以不同风格不同格式来展现文字. 举两个简单的样例: 1.在TextView中加入一个超链接 事实上非常e

Android开发技巧——自定义控件之自定义属性

Android开发技巧--自定义控件之自定义属性 掌握自定义控件是很重要的,因为通过自定义控件,能够:解决UI问题,优化布局性能,简化布局代码. 上一篇讲了如何通过xml把几个控件组织起来,并继承某个ViewGroup子类,把它们封装起来使用.这是我们接触到的最简单的一种自定制控件了.但许多时候,我们还需要在布局文件中使用它们的时候,能通过属性传入一些值,来影响最终的显示结果. 我们在做项目中经常会遇到的一个情况:一张图片加一个文本的组合.比如充值账户成功之后显示的一个界面,上面是一个表示成功的

50个Android开发技巧(24 处理ListView数据为空的情况)

在移动平台上为用户展示数据的一个经常用法是将数据填充进一个List内,而此时须要注意的一点就是: 原文地址:(http://blog.csdn.net/vector_yi/article/details/24936163) 怎样处理须要填充的数据为空的情况? ListView及其它继承自AdapterView的类都有一个简便的处理这样的情况的方法:setEmptyView(View). 当ListView的Adapter为空或者Adapter的isEmpty()方法返回true的时候,它将会把设

Android开发技巧——大图裁剪

本篇内容是接上篇<Android开发技巧--定制仿微信图片裁剪控件> 的,先简单介绍对上篇所封装的裁剪控件的使用,再详细说明如何使用它进行大图裁剪,包括对旋转图片的裁剪. 裁剪控件的简单使用 XML代码 使用如普通控件一样,首先在布局文件里包含该控件: <com.githang.clipimage.ClipImageView xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+i

Android开发技巧之viewstub用法详解及实现延迟加载

这一篇是接着上面的include标签的例子来讲的,地址http://blog.csdn.net/jason0539/article/details/26131831 上一篇的布局中间就用了viewstub这个控件,现在来说一下其作用和用法 " ViewStub 是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,避免资源浪费,在需要的时候才加载View " 需要注意的是,加载view之后,viewstub本身就会被新加载进来的view替换掉 上代码了,看完就理解了