本文并非完全是原创,有网络上边的,也有自己的思考与总结,本文主要有三部分来介绍handler的介绍
####第一:熟悉一下handler的流程
##1,当Android程序第一次创建的时候,在主线程同时会由ActivityThread()创建一个Looper对象。Looper实现了一个简单的消息队列,按照事件的顺
序(添加的顺序,还有可能是延迟的事件顺序)一个接着一个处理Message对象.然后添加到Looper的消息队列中,一个一个处理。主线程的Looper存在
整个应用程序的生命周期内(注意这里是整个生命周期)。
##2,当一个Handler对象在主线程中创建的时候,它会关联到Looper的 message queue 。Message添加到消息队列中的时候Message会持有当前Handler引
用,当Looper处理到当前消息的时候,会调用当前类的Handler中的handmessage().
##3,在java中,no-static的内部类会 隐式的 持有当前类的一个引用。static的类则没有。
####第二:什么情况下handler会造成内存的泄露
##1,看代码分析:
public class MyyActivity extends AppCompatActivity {
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new Thread(new Runnable() {
@Override
public void run() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
System.out.println("我是延迟10分钟后的消息,是在主线程中执行的");
}
}, 60000);
}
}).start();
}
@Override
protected void onDestroy() {
super.onDestroy();
finish();
}
}
当Activity结束后finish(),在 MessageQuence处理这个Message之前,它会持续存活着。这个Message持有Handler的引用,而Handler又持
有Activity(MyyActivity)的引用,这个Activity所有的资源,在这个消息处理之前都不能也不会被回收,所以发生了内存泄露。
####第三:解决办法.
##1,使用静态的内部类在handler的前边加上static,并且加上softweak.并不可取,是因为这样会造成内存的负担,并且software并不可靠.
##2,创建类继承Appalachian,主线程中创建handler,注意使用静态直接的引用即可.
package com.itcast.googleplay.global;
import android.app.Application;
import android.content.Context;
import android.os.Handler;
/**
* $$$$使用继承appalication,并且修改配置程序的入口函数application的onCreate()肯定是先于activity中的oncreate()
* 工具类,模板代码
* Created by Lenovo on 2016/7/27.
*/
public class GooglePlayApplication extends Application {
public static Context context;
/**
* 主线程的消息处理
*/
public static Handler mHandler;
@Override
public void onCreate() {
super.onCreate();
//三大上下文
context = this;
mHandler = new Handler();
//线程创建的消息的方法,一般我们是使用不到子线程的handler的
/* new Thread(new Runnable() {
@Override
public void run() {
Handler handler = new Handler();
Looper.prepare(); //创建轮询器
Looper.loop(); //开启轮训器
handler.sendEmptyMessage(0);
}
}).start();*/
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)