今天学习了使用 HTTP协议,从Android客户端往Tomcat服务器端以GET发送请求,途中无意中发现自己写的Handler类被Android提示:This Handler class should be static or leaks might occur. 往google上type,发现很多网友都做了解释,也感触颇深,编译器的提示,有时真的要留意,这对自己学习也有很大的帮助.

  虽然多了几行代码,但为了实用,我就上贴自己实际点的例子,Activity:

package spt.http.get.activity;

import java.lang.ref.WeakReference;

import spt.http.get.assist.SendDataToServer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity {
//view.
private EditText edt_name = null;
private EditText edt_pwd = null;
private Button btn_ok = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initListener();
} /**
* 初始化View.
*/
private void initView() {
edt_name = (EditText)findViewById(R.id.edt_name);
edt_pwd = (EditText)findViewById(R.id.edt_pwd);
btn_ok = (Button)findViewById(R.id.btn_ok); //test:
edt_name.setText("你好");
edt_pwd.setText("abc");
} /**使用静态内部类,解决'This Handler class should be static or leaks might occur',以免造成内存泄露.
* @author Administrator
*
*/
private static class StatusHandler extends Handler {
WeakReference<MainActivity> iMainActivity = null; public StatusHandler(MainActivity mainActivity) {
iMainActivity = new WeakReference<MainActivity>(mainActivity);
} @Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SendDataToServer.SEND_SUCCESS:
//有iMainActivity.get()和iMainActivity.getClass().
Toast.makeText(iMainActivity.get(), "发送成功", Toast.LENGTH_SHORT).show();
break;
case SendDataToServer.SEND_FAIL:
Toast.makeText(iMainActivity.get(), "发送失败", Toast.LENGTH_SHORT).show();
break;
default:
throw new RuntimeException("未知的发送结果!");
}
}
} /**
* 处理发送是否成功的状态的Handler.
*/
private final Handler handler = new StatusHandler(this); /**
* 初始化监听器.
*/
private void initListener() {
btn_ok.setOnClickListener(new Button.OnClickListener() { @Override
public void onClick(View v) {
String name = edt_name.getText().toString();
String pwd = edt_pwd.getText().toString();
if(name.isEmpty() || pwd.isEmpty()) {
Toast.makeText(MainActivity.this, "用户名和密码不能为空", Toast.LENGTH_SHORT).show();
return;
}
new SendDataToServer(handler).send(name, pwd);
}
});
}
}

将Handler声明为static,是为了解决可能出现'内存泄露'的问题,因为在一般情况下,通过Handler往消息队列中放入Message对象的时候,Message对象会持有对外部类的隐式引用,而是用static类,则不会对外部类有隐式引用.例如,Message对象引用主线程(UI)的视图等资源,如果不及时被处理,则他引用的对象将被一直占用,被引用的对象可能是很久以后才使用,这样一来,内存将很快被耗尽.

ref: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1106/1922.html

Android - This Handler class should be static or leaks might occur.的更多相关文章

  1. Android“This Handler class should be static or leaks might occur”警告的处理方法

    此文属于转载! 最近用到handle在线程中改变UI,会跟给出“This Handler class should be static or leaks might occur”的警告,网上看了很多解 ...

  2. This Handler class should be static or leaks might occur Android

    首先解释下这句话This Handler class should be static or leaks might occur,大致意思就是说:Handler类应该定义成静态类,否则可能导致内存泄露 ...

  3. 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 ...

  4. This Handler class should be static or leaks might occur(null) 解决办法 (转)

    原文链接:http://blog.csdn.net/wuleihenbang/article/details/17126371 首先解释下这句话This Handler class should be ...

  5. This Handler class should be static or leaks might occur,Handler和Context使用的注意事项!

    Android中.在使用到Handler的时候,假设按例如以下代码编写: private Handler handler; @Override public void onCreate(Bundle ...

  6. 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 ...

  7. 85、android handler的警告Handler Class Should be Static or Leaks Occur

    转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1106/1922.html 在使用Handler更新UI的时候,我是这样写 ...

  8. 【Android】[转] Android Handler应设为static

    android开发中,使用Lint检测时会提示这么一句话 : This Handler class should be static or leaks might occur.意为handler应用s ...

  9. Android Weak Handler:可以避免内存泄漏的Handler库

    这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! android使用java作 ...

随机推荐

  1. java线程(3)-多线程死锁

    产生死锁的条件: 1.有至少一个资源不能共享2.至少有一个任务必须持有一个资源并且等待获取另一个被别的任务持有的资源3.资源不能任务抢占4.必须有循环等待 package com.thread; /* ...

  2. Retina

    走向Retina Web RETINA时代的前端优化 <!DOCTYPE html> <html> <head> <meta charset="ut ...

  3. 【log4js】

    手动创建日志目录 定时清理 nodejs之日志管理 玩转Nodejs日志管理log4js access.log-2015-11-20

  4. C#后台执行bat

    C#后台执行bat ProcessStartInfo p = new ProcessStartInfo(); p.FileName = "C:\\1.bat"; p.WindowS ...

  5. HDOJ --- 1176 免费馅饼

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. Web前端常见问题处理

    1. 浏览器后退按钮 这个在注册或者登陆的时候是一个普遍的问题,登陆之后,跳转到另外一个页面,我的鼠标有两个侧键,是用于前进和后退的,有时候会误点侧键,这个时候页面又会回到之前的登录页面,但事实是用户 ...

  7. 394. Coins in a Line

    最后更新 一刷. 用数学方法是看是不是3的倍数. 不用数学方法的话要动态规划. 当前玩家,dp[i]行不行取决于dp[i-1]和dp[i-2],代表下一个玩家能不能赢,另一个玩家能赢的话当前就不能赢: ...

  8. Bitbucket Pull Request和fork

    本文参考了http://blog.jobbole.com/76854/   Pull Request在Forking工作流中使用,这个也同样适用于小团队的开发协作和第三方开发者向开源项目的贡献.当你要 ...

  9. QT_校园导航(绘制路线已实现)_Updata_详细注释

    //MainWidget.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include " ...

  10. 深入理解Objective-C:优化你的代码

    开篇 只要用到Objective-C,我们每天都会跟方法调用打交道.我们都知道Objective-C的方法决议是动态的,但是在底层一个方法究竟是怎么找到的,方法缓存又是怎么运作的却鲜为人知. 本文主要 ...