android 优化策略
2016-02-15 21:55
387 查看
1 布局优化:
merge include 结合 viewStub使用
include 用于布局的重用
merge 节约布局的层次
viewStub 延迟加载
减少层级嵌套
代码实例:
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
与其关联后没有释放资源,很容易造成内存泄漏.
例如:
当上面注册接口的时候,使用了Activity的时候,如果Activity没有解注册的操作,就会造成内存泄漏.
3 在播放无限循环动画的时候,可能造成内存泄漏.
4 内部类的生命周期过长,容易造成内存泄漏.
例如:死循环的线程,因为内部类默认持有外部类的引用.
解决的方法是采用静态内部类,然后使用弱引用的方式引用外部的资源.
同样的情况,handler内存泄漏也适用.
5 没有关闭应该关闭的资源,例如:游标,广播 ,服务等.这些在使用完成之后,
需要关闭.
6 在Activity的生命周期方法中不要做耗时的操作,否则会出现
黑屏现象或者ANR.
7 数据库方面:
1 使用原生的sql语句比系统提供的方法效率高.
2 多数据的修改使用事务的方式.
3 对数据的存储,尽量使用文件,而非数据库.效率至少提高10倍.
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倍.
相关文章推荐
- Android杂谈之Android数据存储方式
- Android contacts 联系人 通讯录 源码 完全解析
- 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)
- android studio从布局文件中提取style
- Android - 利用内容提供者删除通话记录
- android使用全局变量的两种方法
- android include包含布局文件
- android:fitsSystemWindows的作用
- when the android meet dragger2
- 【Android性能优化】(一)使用SparseIntArray替换HashMap
- Android资源文件详解
- AndroidManifest.xml
- Android入门小示例_一键SOS
- #android#获取屏幕宽度 获取imageview宽度
- AndroidStudio查看对象引用,是否内存泄露
- Kotlin Android开发学习记录
- android:TextView实现文字走马灯效果(欺骗系统获取持久的焦点)
- Android Activity返回键控制的两种方式
- Android Activity返回键控制的两种方式
- Android TextView 添加下划线的几种方式