1、使用 Maven 依赖方案代替使用导入jar包方案

如果项目中需要用到第三方jar包,常用的做法是去网上下载后然后放入libs文件夹,再添加到项目依赖,不过,在Android Studio已经不推荐使用这套做法了,因为如果jar有更新,那么每次都要去下载最新版本然后删除历史依赖再添加新版本的依赖,这样做很繁琐,而在Android Studio中,这个问题使用Maven已经很好的解决了,因为AS中默认的是jcenter中央库,而jcenter默认会同步Maven中央库,所以我们可以使用Gradle来添加依赖来代替之前的做法,例如:

dependencies {
    compile 'com.android.support:appcompat-v7:22.+'
    compile 'com.squareup.okhttp:okhttp:2.0.+'
    compile 'com.android.support:recyclerview-v7:22.+'
    compile 'com.android.support:cardview-v7:22.2.+'
}

我们这样使用,就指定了一个版本范围,当构建项目时候会自动从Maven库中获取指定范围的最新版本的jar包资源

2、避免深层次的布局结构(最多不要超过5层)

复杂的结构可以考虑用相对布局

3、将相同控件的相同属性抽取出来为一个style

例如:

假如有若干个Button,而Button的样式都是统一的,这时候我们可以将Button的字体大小、颜色、背景色、字体类型等抽取出来放在一个style中,供多个Button复用,如:

<style name="MyButton" parent="Base.Widget.AppCompat.Button">
        <item name="android:textSize">16sp</item>
        <item name="android:textColor">#ffffff</item>
        <item name="android:background">#202020</item>
        <item name="android:typeface">sans</item>
</style>

layout布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <Button
        style="@style/MyButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Space
        android:layout_width="match_parent"
        android:layout_height="10dp" />

    <Button
        style="@style/MyButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/action_settings" />

    <Space
        android:layout_width="match_parent"
        android:layout_height="10dp" />

    <Button
        style="@style/MyButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name" />
</LinearLayout>

效果:

可以看到这三个Button的样式都一样,复用了相同的style

4、慎用AsyncTask,使用网络请求框架(Volley、OkHttp)代替

关于AsyncTask在异步网络请求方面用的非常多,因为它使用起来比较轻量,但是关于AsyncTask也存在内存泄漏和结果丢失等问题,下面一起来看看:

1、内存泄漏

如果在Activity中使用AsyncTask以匿名内部类的方式请求网络,由于AsyncTask的生命周期可以比Activity的长(因为请求网络数据是比较耗时的),AsyncTask内部类持有Activity的引用的话,如果还在请求网络时就关闭了Activity,那么将导致Activity对象将无法回收,进而产生内存泄漏

2、结果丢失

假如Activity的launchMode是默认或者是标准的,那么当AsyncTask在请求网络数据时把屏幕旋转了,那么将会重新创建一个新的Activity,又因为还在运行的AsyncTask持有之前Activity的引用,那么将导致onPostExecute()方法不起任何作用,请求获得的数据不能加载到新的Activity上,而且也将导致内存泄漏

3、串行和并行多版本不一致

AsyncTask在1.6之前为串行,在1.6-2.3为并行,在3.0之后又改为串行,在3.0之后虽然可以通过代码来改变默认的串行为并行,但是又是一个繁琐的操作

Android性能优化典例(二)的更多相关文章

  1. Android性能优化典例(一)

    在Android开发过程中,很多时候往往因为代码的不规范.api使用不恰当.控件的使用场景考虑不全面和用户不恰当的操作等都能引发一系列性能问题的,下面就是我目前整理的一些Android开发过程中需要注 ...

  2. Android性能优化典范(二)

    Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...

  3. Android性能优化第(二)篇---Memory Monitor检测内存泄露

    上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露的问题,现在通过Android Studio自带工具Memory Monitor 检测出 ...

  4. Android性能优化问题总结

    性能优化这块,分为UI性能优化.内存优化.数据库优化.网络优化.耗电优化等等.可以从1.如何发现问题,2.怎么解决问题,3.解决效果对比,这几个方面去描述.举个简单例子——UI优化,可以从 UI出现什 ...

  5. Android 性能优化探究

    使用ViewStub动态载入布局.避免一些不常常的视图长期握住引用: ViewStub的一些特点: 1. ViewStub仅仅能Inflate一次,之后ViewStub对象被置空:某个被ViewStu ...

  6. Android 性能优化的方面方面都在这儿

    又到周六了,鸿洋的不定期的周六放送又来了~~这次来谈谈性能优化吧.大家在工作中或多或少都会拿自家的应用和竞品app做比对,不可避免的需要做一些app性能优化的活.很多时候可能是策略上的调整,不过还是有 ...

  7. Android性能优化的方方面面

    通常项目比较大的APP都面临着如下性能问题,APP启动慢.界面跳转慢.事件相应慢.滑动和动画卡顿.展现内容慢等,有的公司处理的很好,有的还有很大的优化空间,对于性能优化,怎么去做,我总结了一下性能优化 ...

  8. Android性能优化典范---转

    Android性能优化典范 原文链接:  http://hukai.me/android-performance-patterns/ JAN 17TH, 2015 | COMMENTS 2015新年伊 ...

  9. 老李分享:Android性能优化之内存泄漏1

    老李分享:Android性能优化之内存泄漏   前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我 ...

随机推荐

  1. Linux内核中的有关Page的算法

    static inline int get_order(unsigned long size) { int order; size = (size-1) >> (PAGE_SHIFT-1) ...

  2. OpenCV Python 录制视频

    调用摄像头 引入库支持 初始化 调整界面大小 实时显示 录制视频并保存 fourcc问题解决 代码实现 效果展示 总结 学到实用OpenCV调用笔记本电脑的摄像头,并录制视频保存到本地硬盘的时候,出现 ...

  3. Dynamics CRM2016 查询数据的三种方式的性能对比

    之前写过一个博客,对非声明验证方式下连接组织服务的两种方式的性能进行了对比,但当时只是对比了实例化组织服务的时间,并没有对查询数据的时间进行对比,那有朋友也在我的博客中留言了反映了查询的时间问题,一直 ...

  4. Cocoa层粒子发射器动画添加多个cell的一种重构

    在iOS动画之旅第19章中最后的挑战中需要我们在雪花例子发生器中添加多个雪花贴图,也就是多个cell,因为我们不可能将每个cell的参数都重新写一遍,所以有必要写一个helper方法来做这件事: fu ...

  5. [error]error while loading shared libraries: libpcre.so.1 解决

    nginx 安装好之后,启动的时候报错 [root@localhost nginx-1.6.2]# /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin ...

  6. mvn管理项目jar包

    Maven是一个采用纯Java编写的开 源项目管理工具.Maven采用了一种被称之为project object model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xm ...

  7. TCP连接建立系列 — 客户端的端口选取和重用

    主要内容:connect()时的端口选取和端口重用. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 端口选取 connect()时本地端口是如何选取的呢 ...

  8. Java程序员的必备知识-类加载机制详解

    类加载器的概念 类加载器是一个用来加载类文件的类. Java源代码通过javac编译器编译成类文件.然后JVM来执行类文件中的字节码来执行程序.类加载器负责加载文件系统.网络或其他来源的类文件. JV ...

  9. (一〇七)iPad开发之modal的切换方式与展示方式

    在iPad上modal有四种切换方式,分别是竖直进入(由下到上,默认方式).水平翻转.淡入淡出. 属性要设置在将要modal出来的控制器上: /* typedef NS_ENUM(NSInteger, ...

  10. Dynamics CRM2013/2015 Plugin注册工具Register New Assembly时无法看到注册按钮的解决办法

    CRM2013的注册插件工具UI相比2011之前有了一定的改变,但改变UI的同时也给开发人员带来了困扰,打开注册工具点击Register按钮选择dll时页面就是下面这样的,你完全看不到最下面的两个按钮 ...