• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > WeakReference在Handler中的应用,weakhandler

WeakReference在Handler中的应用,weakhandler

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了weakreference,java weakreference,c weakreference,new weakreference,handler等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

WeakReference在Handler中的应用,weakhandler


 

 1 public class AutoActivity extends Activity {
 2 
 3     Handler handler = new Handler(){
 4         public void handleMessage(android.os.Message msg) {
 5             
 6         };
 7     };
 8     @Override
 9     protected void onCreate(Bundle savedInstanceState) {
10         super.onCreate(savedInstanceState);
11         setContentView(R.layout.activity_auto);
12     }
13 }

  上面这段代码在handler对象创建的时候却会报警告:This Handler class should be static or leaks might occur。意思是:Handler

类应该为static类型,否则可能会造成内存泄漏。

  为什么会造成这种情况呢?

  这种情况就是由于android的特殊机制造成的:当一个android主线程被创建的时候,同时会有一个Looper对象被创建,而这个Looper对象会实现一个MessageQueue(消息队列),当我们创建一个handler对象时,而handler的作用就是放入和取出消息从这个消息队列中,每当我们通过handler将一个msg放入消息队列时,这个msg就会持有一个handler对象的引用。因此当Activity被结束后,这个msg在被取出来之前,这msg会继续存活,但是这个msg持有handler的引用,而handler在Activity中创建,会持有Activity的引用,因而当Activity结束后,Activity对象并不能够被gc回收,因而出现内存泄漏。

  这个根本原因就是:Activity在被结束之后,MessageQueue并不会随之被结束,如果这个消息队列中存在msg,则导致持有handler的引用,但是又

由于Activity被结束了,msg无法被处理,从而导致永久持有handler对象,handler永久持有Activity对象,于是发生内存泄漏。但是为什么为static类型就

会解决这个问题呢?因为在java中所有非静态的对象都会持有当前类的强引用,而静态对象则只会持有当前类的弱引用。声明为静态后,handler将会持

有一个Activity的弱引用,而弱引用会很容易被gc回收,这样就能解决Activity结束后,gc却无法回收的情况。

 

所以解决这个警告就有几种方法:

一:将hanlder对象声明为静态的对象。

二:使用静态内部类,通过WeakReference实现对Activity的弱引用。具体实现看以下代码:

 1 public class AutoActivity extends Activity {
 2     
 3     MyHandler handler = new MyHandler(this);
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_auto);
 8     }
 9     
10     static class MyHandler extends Handler{
11         WeakReference<AutoActivity> mactivity;
12         
13         public MyHandler(AutoActivity activity){
14             mactivity = new WeakReference<AutoActivity>(activity);
15         }
16         
17         @Override
18         public void handleMessage(Message msg) {
19             super.handleMessage(msg);            
20             switch (msg.what) {
21             case 100:                
22                 //在这里面处理msg
23                 //通过mactivity.get()获取Activity的引用(即上下文context)
24                 break;                
25             default:
26                 break;
27             }
28         }
29     }
30 }

 

转自:https://my.oschina.net/u/1177694/blog/523922

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android学习笔记之SoftReference软引用,弱引用WeakReference,weakreference
  • WeakReference在Handler中的应用,weakhandler

相关文章

  • 2017-05-26实现在矩形框中输入文字,可以显示剩余字数的功能,矩形字数
  • 2017-05-26硅谷社交10--会话详情页面,硅谷社交10--会话
  • 2017-05-26Linux内核系列—10.操作系统开发之内核HelloWorld,linuxhelloworld
  • 2017-05-26HTTP 首部字段详细介绍,首部字段详细介绍
  • 2017-05-26Android studio 插件之 GsonFormat (自动生成javabean)
  • 2017-05-26android 打造炫酷导航栏(仿UC头条)
  • 2017-05-26Android常用英文词汇,不为命名纠结,android英文
  • 2017-05-26订单流程view,订单view
  • 2017-05-26Android中View的事件分发机制——Android开发艺术探索笔记
  • 2017-05-26Drawable资源的初步使用

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android之ViewPager 第二课,androidviewpager
    • 活动的生命周期系列(一)返回栈,生命周期系列
    • 2.5.7 Toast(吐司)的基本使用
    • overridePendingTransition,transition
    • Android安全专项-AndBug动态调试工具环境搭建
    • android studio下百度地图sdk的初体验
    • Android--BroadcastReceiver应用详解
    • Android 手机卫士--参照文档编写选择器,android选择器
    • 三年0故障总结,提升代码质量的秘诀
    • 单机搭建Android开发环境(五),单机搭建android开发

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有