您的位置:首页 > 移动开发 > Android开发

android 优化策略

2016-02-15 21:55 387 查看
1 布局优化:

merge include 结合 viewStub使用

include 用于布局的重用

merge 节约布局的层次

viewStub 延迟加载

减少层级嵌套

代码实例:

<merge
xmlns:android="http://schemas.android.com/apk/res/android"
>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="one"
/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="two"
/>
</merge>

include 使用:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

<include layout="@layout/titlebar"/>

</LinearLayout>

viewStub 使用:
<ViewStub
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout="@layout/titlebar"
android:id="@+id/stub"

View view=((ViewStub)this.findViewById(R.id.stub)).inflate();


2 绘制优化

View 的onDraw会频繁的调用,所以再自定义控件的时候,

该方法尽量减少的复杂度. 不要绘制不必要的背景

3 listview 的优化

1 converView 的复用

2 ViewHolder 的使用,最好定义成静态的成员,避免内存泄漏.

3 图片的缓存加载策略

1 压缩图片

2 异步加载图片:

1 从内存中获取图片

2 获取不到,开启线程,从sd卡中获取.

在适配器中设置变量,表示listview是否滑动,如果滑动,则只能从内存中

获取图片,如果滑动停止,则可以开启线程加载图片.

3 获取不到,开启网络获取,并将图片存入sd卡.

开启的线程最好是线程池来管理.

4 卡顿现象的优化: 不要在主线程中执行太耗时的操作,例如:

1.getView() 方法中不要直接加载图片,采用异步框架.

2.控制异步任务的执行频率,例如:

当listview滑动的时候,停止加载图片.

3.必要的时候,开启硬加速.

5 访问网络数据时,采用分页加载.同时,请求数据采用缓存,查看缓存中是否有想要的数据,如果没有,则从网络上查询数据.

4 线程优化 采用线程池的方法管理线程

5 内存泄漏的分析:

1 静态变量导致的内存泄漏.因为静态变量的声明周期长,所以,

容易造成内存泄漏.

2 单例模式的内存泄漏:

单例模式的特点是其声明周期与Application相同,所以,当Activity

与其关联后没有释放资源,很容易造成内存泄漏.

例如:

public class TestManager {

private TestManager(){

}

private static TestManager instance;

public static TestManager getInstance(){
return instance;
}

private List<OnDataArrivedListener> listeners=new ArrayList<OnDataArrivedListener>();

public interface OnDataArrivedListener{
public void onDataArrived(Object object);
}

public synchronized void register(OnDataArrivedListener listener){
if(!listeners.contains(listener)){
listeners.add(listener);
}
}

public synchronized void unregister(OnDataArrivedListener listener){
if(listeners.contains(listener)){
listeners.remove(listener);
}
}
}


当上面注册接口的时候,使用了Activity的时候,如果Activity没有解注册的操作,就会造成内存泄漏.

3 在播放无限循环动画的时候,可能造成内存泄漏.

4 内部类的生命周期过长,容易造成内存泄漏.

例如:死循环的线程,因为内部类默认持有外部类的引用.

解决的方法是采用静态内部类,然后使用弱引用的方式引用外部的资源.

同样的情况,handler内存泄漏也适用.

private  static class MyThread extends Thread{

private boolean isLive;

@Override
public void run() {
isLive=true;
while(isLive){
Log.v("qin", "2");
SystemClock.sleep(1000);
}
}

public void close(){
isLive=false;
}
}


5 没有关闭应该关闭的资源,例如:游标,广播 ,服务等.这些在使用完成之后,

需要关闭.

6 在Activity的生命周期方法中不要做耗时的操作,否则会出现

黑屏现象或者ANR.

7 数据库方面:

1 使用原生的sql语句比系统提供的方法效率高.

2 多数据的修改使用事务的方式.

3 对数据的存储,尽量使用文件,而非数据库.效率至少提高10倍.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: