2016-9-5

来源:互联网 发布:淘宝lee是正品吗 编辑:程序博客网 时间:2024/04/28 17:32

2016-9-5

1.Android内存溢出的几种情况

Android中的内存溢出基本发生在以下三种情况:    1.成员或全局静态对象或单例对象对activity的强引用    2.不在activity生命周期内的线程对activity的强引用    3.activity中生命周期不可控的内部类或匿名类对activity的隐式引用  在activity中引用着大量的view和其他资源,如果在ondestory()后没能把activity回收,则会造成内存溢出以下是几种场景:    1. activity内的静态成员对象引用运行状态的activity(如把activity以参数的形式传给静态成员对象,并且在此对象中对其持续引用), 静态对象会在内存中一直保持加载状态,这个对象持有了对activity的引用,就不会被GC回收, 如果在activity生命周期结束时没有清除引用则会引起activity泄漏    2. 在单例模式的类中不能持有activity的context,即不能把activity传给单例类来构造对象    2. activity中的view被实例成静态的, 在activity中的view会持有对它的context的引用, 如果必须使用静态view要确保activity完成前把View从视图层级中分离出去    3. 在activity中的内部类的静态变量引用了activity的context, 这时可以使用WeakReference包裹,在使用时先判空再使用    4. 匿名类持有包含它的类的引用, 如在activity中匿名地声明并且实例化一个AsyncTask, 在activity销毁后它仍在后台工作的话, 对activity的引用会持续到后台工作完成才进行GC    5. 注意在activity中创建(非静态)内部类或匿名类, 都会对包含它的类有隐式的应用,不要在activity中创建生命周期不可控的内部类或匿名类如(AsyncTask)     5. Handler的后台任务, 定义的Runnable对象被Handler加入了执行队列,Runnable会引用定义它的activity并持有到Handler的消息队列中,只要在activity销毁前消息还没被处理,activity就会被保留在内存中,要注意在activity销毁时从Hanlder移除Runnable对象    6. Thread或TimerTask持有activity的引用, 在activity销毁时注意移除    7. 在单例类中持有activity的context在activity中初始化对象时,要留心潜在的引用, 对activity的引用要是WeakReference, 并及时观测程序运行时内存的释放情况在需要传入Context的时候尽量考虑使用Application的Context,而不是Activity的在Activity中尽量避免使用生命周期不受控制的非静态类型的内部类(如匿名类),可以使用静态类型的内部类加上弱引用的方式实现

2.HandlerThread使用

1.创建并启动 mHandlerThread = new HandlerThread("HandlerThread");    mhandlerThread.start();2.使用HanlderThread中的Looper创建Hanlder    Handler handler = new Handler(mHandlerThread.getLooper()){            @Override            public void handleMessage(Message msg) {// 非UI线程            }        };3.在任意线程发送消息4.onDestory()中退出     mHandlerThread.quit();    或mHandlerThread.quitSafely();//是针对在消息队列中还有消息或者是延迟发送的消息没有处理的情况,调用这个方法后都会被停止掉HandlerThread继承Thread其内部维护了一个Looper,使用HandlerThread不用手动去调用Looper.prepare()和Looper.loop()等方法,Handler依赖Looper来维护发出的消息,在一个线程中创建Handler必须为其指定Looper,在UI线程Android已创建好了Looper,使用Context.getMainLooper();可以获得

3.android5.0按钮水波纹(ripple)效果使用

<?xml version="1.0" encoding="utf-8"?>  <ripple xmlns:android="http://schemas.android.com/apk/res/android"      android:color="#FFEEEEEE">      <item android:id="@id/mask" android:drawable="@color/white" />  </ripple> ripple相当于layer-list层叠效果,ripple元素的color属性即指定了波纹效果的颜色,但必须是8位颜色代码值,前两位指定了波纹的透明度,后六位即波纹颜色,以黑色000000及白色FFFFFF效果最为明显<item android:id="@id/mask" android:drawable="@color/white" />即指定了按钮的正常状态的显示效果必须在5.0以上有效果, 可以新建drawable-v21文件夹, 在drawable和drawable-v21放两套同名的文件,drawable-v21为5.0以上使用, drawable为5.0以下使用
0 0