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>


效果:

Android性能优化典例(二)_版本号

能够看到这三个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之后尽管能够通过代码来改变默认的串行为并行。可是又是一个繁琐的操作