Android“This Handler class should be static or leaks might occur”警告的处理方法
此文属于转载!
最近用到handle在线程中改变UI,会跟给出“This Handler class should be static or leaks might occur”的警告,网上看了很多解决办法,但都不够详细,这里我重新写一下这个问题的解决办法。
1.问题原因:在ADT 20 Changes我们可以找到这样一个变化:“New Lint Checks: Look for handler leaks: This check makes sure that a handler inner class does not hold an implicit reference to its outer class.” 就是说在ADT20以后加入了一条新的检查规则:确保类内部的handler不含有对外部类的隐式引用 。
2.解决办法:我这里提供三种解决办法推荐第三种。
第一种:(不推荐)根据eclipse的提示,直接加入
“@SuppressLint("HandlerLeak")”的注释或者在
Window-->Preferences-->Android-->Lint Error
Checking里面检索HandlerLeak,然后选择ignore。如下图:
不推荐 这种方法,这种方法实际上没有解决问题。
第二种 :把Handler定义成static,然后用post方法把Runnable对象传送到主线程,代码如下:
- private static Handler handler;
- private TextView textView;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- handler = new Handler(); // Create a handler to update the UI
- }
- void test() {
- handler.post(new MyRunnable());
- }
- static public class MyRunnable implements Runnable {
- @Override
- public void run() {
- textView.setText(R.string.success);//改变textView显示的内容
- /*此处放入要改变UI的操作即可*/
- }
- }
这种方法将要发送的消息转换成了对应的Runable对象,适用于只有一个消息要发送的情形,如果有多个消息要发送可以采用第三种方法。
第三种 :(推荐)这里我们可以采用弱引用的方式来解决问题,我们先定义一个static的内部类MyHandler,然后让它持有Activity的弱引用,这样问题就得到了解决。代码如下:
- static class MyHandler extends Handler {
- //注意下面的“PopupActivity”类是MyHandler类所在的外部类,即所在的activity
- WeakReference<PopupActivity> mActivity;
- MyHandler(PopupActivity activity) {
- mActivity = new WeakReference<PopupActivity>(activity);
- }
- @Override
- public void handleMessage(Message msg) {
- PopupActivity theActivity = mActivity.get();
- switch (msg.what) {
- //此处可以根据what的值处理多条信息
- case 0x0001:
- //这里可以改变activity中的UI控件的状态
- theActivity.textView.setText(R.string.hello_world);
- break;
- }
- case 0x0002:
- //这里可以改变activity中的UI控件的状态
- theActivity.textView.setText(R.string.welcome);
- break;
- /*这里可以有多条要处理信息的操作*/
- /*... ...*/
- }
- }
- };
- //实例化一个MyHandler对象
- MyHandler testHandler = new MyHandler(this);
- private void test1() {
- //这里发送了一个空消息,空消息的what值是0x0001
- testHandler.sendEmptyMessage(0x0001);
- }
- private void test2() {
- //这里发送了一个空消息,空消息的what值是0x0001
- testHandler.sendEmptyMessage(0x0002);
- }
如果您有更好的解决方案,欢迎留言,参考文献:http://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-occur-incominghandler
Android“This Handler class should be static or leaks might occur”警告的处理方法的更多相关文章
- Android - This Handler class should be static or leaks might occur.
今天学习了使用 HTTP协议,从Android客户端往Tomcat服务器端以GET发送请求,途中无意中发现自己写的Handler类被Android提示:This Handler class shoul ...
- This Handler class should be static or leaks might occur Android
首先解释下这句话This Handler class should be static or leaks might occur,大致意思就是说:Handler类应该定义成静态类,否则可能导致内存泄露 ...
- android之lint警告This Handler class should be static or leaks might occur
更新到adt2.0的开发者们可能会在handler上发现这么一条警告:This Handler class should be static or leaks might occur . 首先在ADT ...
- This Handler class should be static or leaks might occur(null) 解决办法 (转)
原文链接:http://blog.csdn.net/wuleihenbang/article/details/17126371 首先解释下这句话This Handler class should be ...
- This Handler class should be static or leaks might occur,Handler和Context使用的注意事项!
Android中.在使用到Handler的时候,假设按例如以下代码编写: private Handler handler; @Override public void onCreate(Bundle ...
- Handler classes should be static or leaks might occur
http://droidyue.com/blog/2014/12/28/in-android-handler-classes-should-be-static-or-leaks-might-occur ...
- 85、android handler的警告Handler Class Should be Static or Leaks Occur
转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1106/1922.html 在使用Handler更新UI的时候,我是这样写 ...
- 【Android】[转] Android Handler应设为static
android开发中,使用Lint检测时会提示这么一句话 : This Handler class should be static or leaks might occur.意为handler应用s ...
- Android Weak Handler:可以避免内存泄漏的Handler库
这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! android使用java作 ...
随机推荐
- linux kernel启动流程
linux kernel启动是从./init/main.c中开始的,其大概流程是: 1. 调用start_kernel()函数: 2. start_kernel()调用rest_init()函数: 3 ...
- Hibernate HQL查询的参数绑定
参数绑定: Hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定: ...
- HTML 中的meta标签中的http-equiv与name属性使用介绍
meta是html语言head区的一个辅助性标签.也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,meta标签的作用有:搜索引擎优化(SEO),定义页面使用语言, ...
- Android Touch事件分发机制
参考:http://blog.csdn.net/xiaanming/article/details/21696315 参考:http://blog.csdn.net/wangjinyu501/arti ...
- [HIHO1318]非法二进制(动态规划)
题目链接:http://hihocoder.com/problemset/problem/1318 题意:是个dp题.考虑二进制数为i位的时候,无非有两种情况:新添加的一位为0或者1. 为0的时候,那 ...
- Eclipse中Python插件PyDev的安装与配置流程
安装PyDev插件的两种安装方法: 方法1.下载地址:http://sourceforge.net/projects/pydev/files/,将下载的PyDev解压(目前最新版本 PyDev 4.5 ...
- Android studio中使用asmack的jar包的前期准备工作
1.下载相应的jar包,官网:http://asmack.freakempire.de/SNAPSHOTS/ 将下载好的jar包拷贝到工程文件的libs文件夹下 2.右击app,然后依次操作 然后点击 ...
- apache开源项目 -- Tuscany
tuscany是Apache组织关于SOA实现的一个开放源码的工程项目,目前处于孵化期阶段. 该项目主要基于SCA,SDO,DAS等技术上实现的. SCA 的基本概念以及 SCA 规范的具体内容并不在 ...
- Java [Leetcode 94]Binary Tree Inorder Traversal
题目描述: Given a binary tree, return the inorder traversal of its nodes' values. For example:Given bina ...
- 用NSData和NSFileManager保存内存中的对象
曾经接触过iOS开发,并且开发过两个应用,纵然青涩,也算是一断美好的回忆.转眼就已经一年多了!现在回过头来决定再次拿起iOS开发. 下面讲NSData: NSdata的概念 1.使用文件时需要频繁地将 ...