Android 性能优化汇总:
目录:
检测是否会有会造成内存泄露的地方,按以下步骤:
1.点击一次”GC”相当向虚拟机请求一次gc操作
2.不必点击多次,Heap会自动定时更新,不断操作应用的过程就能看到内存的使用变化.
以下是一个用完对象后回收的小段代码:
Vector v=new Vector(10);
for (int i=1;i<10000; i++)
{
Object o=new Object();
v.add(o);
o=null;
}
3.我想告诉大家我的观点:
4.面试官这么问就是想引出你怎么处理内存问题而已从而问你OOM(说白了就是内存不足).
方法1:等比例缩小图片并回收:(点击访问专题)
//最后回收
bmp.recycle();
方法2::对图片采用软引用,及时地进行recyle()操作,释放内存
SoftReference bitmap = new SoftReference(pBitmap);
//在这里获取并使用图片操作;
//doSomething();
if(bitmap != null){
if(bitmap.get() != null && !bitmap.get().isRecycled()){
//回收并置空
bitmap.get().recycle();
bitmap = null;
}
}
Drawable drawable = getResources().getDrawable(R.drawable.id);
ImageView imageView = new ImageView(this);
imageView.setBackgroundDrawable(drawable);
在Activity destory 时注意,drawable.setCallback(null); 防止Activity得不到及时的释放。
原因是: 我们如果背景图很大,然后我们打开了过个界面,那么就会加载很过的xml,而上面的drawable.setCallback能更快的释放.
public class ClassName{
public static Context mContext;
}
//静态的成员变量属于类的实例
private static Drawable sBackground;
@Override protected void onCreate(Bundle state) {
super.onCreate(state);
//定义控件和上下文绑在以前
TextView label = new TextView(this);
label.setText("Leaks are bad");
if (sBackground == null) {
//静态变量赋值获取图片
sBackground = getDrawable(R.drawable.large_bitmap);
}
//控件设置背景图,和静态变量联系在一起了
label.setBackgroundDrawable(sBackground);
setContentView(label);
}
static解决方案:
(产生的原因:线程生命周期不可控)
代码如下:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new MyThread().start();
}
private class MyThread extends Thread {
@Override
public void run() {
super.run();
// 这里进行耗时操作,且拥有Context,没执行完就切换屏幕
}
}
}
采用下面的代码,会发现销毁后还是打印:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new MyThread().start();
}
static class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("onDestroy-----------------------------------");
}
我们常常这样写,按我们的理解,当我们切换横竖屏,Activity生命周期重新计算,然后就destroy了,对象对象垃圾了,但是因为线程是非静态内部类,持有外部类的强引用,所以即使我们销毁了界面,但是线程还在运行,若持有上下文引用,那么Activity销毁后,对象依然不会被释放,如果;
解决方法:
(PS:我们平时都是用 try catch处理可能存在的异常,或者在方法上用throws抛出,但是有一些异常我们捕获不了比如UncatchException 比如空指针等等)
小例子:
int a = 0;
int c = 14/a;
public class MyApplication extends Application implements Thread.UncaughtExceptionHandler {
@Override
public void onCreate() {
super.onCreate();
// 在onCtreat里要设置默认的未获取异常的Handler
// 给Thread 类设置默认异常处理handler,如果这句代码不执行则一切都是白搭。
Thread.setDefaultUncaughtExceptionHandler(this);
}
// 在uncaughtException方法中我们必须新开辟个线程进行我们异常的收集工作,然后将系统给杀死。
@Override
public void uncaughtException(final Thread thread, final Throwable ex) {
// 开启线程获取异常
// 读取异常
// 然后再把系统杀死
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
// 获取线程的ID和异常信息
Toast.makeText(MyApplication.this, "thread id = " + thread.getId() + ", info = " + ex.toString(),
Toast.LENGTH_SHORT).show();
Looper.loop();
}
}).start();
}
}
此时MyApplication还是灰色的,我们要在清单文件里的< application里>注册:
<application
android:name=".MyApplication"
MyApplication就变成被使用了
所以当程序运行,在过程中如果碰到未捕获的异常,就能捕获到为捕获的异常;
点击访问:
http://blog.csdn.net/yanbober/article/details/48394201
目录如下:
1.背景
2.应用UI性能问题分析
2-1 应用UI卡顿原理
2-2 应用UI卡顿常见原因
2-3 应用UI卡顿分析解决方法
2-3-1 使用HierarchyViewer分析UI性能
2-3-2 使用GPU 过度绘制分析UI性能
2-3-3 使用GPU 呈现模式图及FPS考核UI性能
2-3-4 使用Lint进行资源及冗余UI布局等优化
2-3-5 使用Memory 监测及GC打印与Allocation Tracker进行UI卡顿分析
2-3-6 使用Traceview和dmtracedump进行分析优化
2-3-7 使用Systrace进行分析优化
2-3-8 使用tracestxt文件进行ANR 分析优化
2-4 应用UI性能分析解决总结
3.应用开发Memory 内存性能分析优化
3-1 Android 内存管理原理
3-2 Android 内存泄露性能分析
3-2-1 Android应用内存泄露概念
3-2-2 Android应用内存泄露察觉手段
3-2-3 Android应用内存泄露leakcanary 工具定位分析
3-2-4 Android应用内存泄露MAT工具定位分析
3-2-5 Android应用开发规避内存泄露建议
3-3 Android 内存溢出OOM性能分析
3-3-1 Android应用内存溢出OOM概念
3-3-2 Android应用内存溢出OOM性能分析
3-3-3 Android应用规避内存溢出OOM建议
3-4 Android 内存性能优化总结
4.Android 应用API使用及代码逻辑性能分析
4-1 Android 应用StringStringBuilderStringBuffer优化建议
4-2 Android 应用OnTrimMemory 实现性能建议
4-3 Android 应用HashMap 与ArrayMap 及SparseArray优化建议
4-4 Android 应用ContentProviderOperation优化建议
4-5 Android 应用其他逻辑优化建议
5.Android 应用移动设备电池耗电性能分析
5-1 Android 应用耗电量概念
5-2 Android 应用耗电量优化建议
6.Android应用开发性能优化总结