解决Handler黄色警告,Handler正确使用方式
来源:互联网 发布:淘宝热销产品排行榜 编辑:程序博客网 时间:2024/05/21 09:05
转 :http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1106/1922.html
一般我们写Handler的时候会这样写:
但是这样我们会被警告:
This Handler class should be static or leaks might occur (null)
意思是:Handler必须是静态的,不然可能会发生内存泄漏
分析:
1.Android App启动的时候,Android Framework 为主线程创建一个Looper对象,这个Looper对象将贯穿这个App的整个生命周期,它实现了一个消息队列(Message Queue),并且开启一个循环来处理Message对象。而Framework的主要事件都包含着内部Message对象,当这些事件被触发的时候,Message对象会被加到消息队列中执行。
2.当一个Handler被实例化时(如上面那样),它将和主线程Looper对象的消息队列相关联,被推到消息队列中的Message对象将持有一个Handler的引用以便于当Looper处理到这个Message的时候,Framework执行Handler的handleMessage(Message)方法。
3.在 Java 语言中,非静态匿名内部类将持有一个对外部类的隐式引用,而静态内部类则不会。
以下面代码为例:
public class SampleActivity extends Activity { private final Handler mLeakyHandler = new Handler() { @Override public void handleMessage(Message msg) { // ... } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Post a message and delay its execution for 10 minutes. mLeakyHandler.postDelayed(new Runnable() { @Override public void run() { } }, 60 * 10 * 1000); // Go back to the previous Activity. finish(); }}
当Activity被finish()掉,Message 将存在于消息队列中长达10分钟的时间才会被执行到。这个Message持有一个对Handler的引用,Handler也会持有一个对于外部类(SampleActivity)的隐式引用,这些引用在Message被执行前将一直保持,这样会保证Activity的上下文不被垃圾回收机制回收,同时也会泄露应用程序的资源(views and resources)。
为解决这个问题,下面这段代码中的Handler则是一个静态匿名内部类。静态匿名内部类不会持有一个对外部类的隐式引用,因此Activity将不会被泄露。如果你需要在Handler中调用外部Activity的方法,就让Handler持有一个对Activity的WeakReference,这样就不会泄露Activity的上下文了,正确的写作方式:
public class SampleActivity extends Activity { /** * Instances of static inner classes do not hold an implicit * reference to their outer class. */ private static class MyHandler extends Handler { private final WeakReference<SampleActivity> mActivity; public MyHandler(SampleActivity activity) { mActivity = new WeakReference<SampleActivity>(activity); } @Override public void handleMessage(Message msg) { SampleActivity activity = mActivity.get(); if (activity != null) { // ... } } } private final MyHandler mHandler = new MyHandler(this); /** * Instances of anonymous classes do not hold an implicit * reference to their outer class when they are "static". */ private static final Runnable sRunnable = new Runnable() { @Override public void run() { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Post a message and delay its execution for 10 minutes. mHandler.postDelayed(sRunnable, 60 * 10 * 1000); // Go back to the previous Activity. finish(); }}
- 解决Handler黄色警告,Handler正确使用方式
- 解决handler警告问题
- 解决Android中Handler警告
- Handler的正确使用
- 正确使用Handler
- 解决Android中Handler警告、SimpleDateFormat警告、"String".toUpperCase()警告
- 解决Android中Handler警告、SimpleDateFormat警告、"String".toUpperCase()警告
- Android Handler正确使用姿势
- 解决Android中Handler警告、…
- Handler---Handler异步方式详解及其使用
- 如何看待Handler使用中的警告
- AndroidStudio完美解决"Activity使用Handler时出现警告信息"的问题
- Android中的Handler使用方式
- Andorid:Handler多种使用方式
- Handler的正确使用,软引用封装
- Handler的正确使用,防止内存泄漏
- Handler警告以及解决方法
- 使用handler内存泄漏解决
- 搬瓦工(bandwagonhost.com) centos6 pptpd iptables 设置
- 2016暑假的好题
- 15、CSS3-响应式布局
- 重温应用程序的生命周期
- 静态解析,动态连接,静态分派,动态分派之间的联系和区别
- 解决Handler黄色警告,Handler正确使用方式
- Android中自动跳转到系统设置界面
- 分苹果&&星级穿越
- 下拉菜单被挡住了,DIV置于最底层的方法
- 生成Webservice客户端的4中方法
- 特征选择算法之 ReliefF 算法
- 【杭电1260】Tickets
- 文章标题
- bzoj 2154 && bzoj 2693