Android中handler引用记录
来源:互联网 发布:linux vim 新建文件 编辑:程序博客网 时间:2024/06/05 21:04
题记:
参考博客:http://my.oschina.net/u/1177694/blog/523922
http://my.oschina.net/ydsakyclguozi/blog/404389
今天在看泡网的代码看到了WeakReference(弱引用)这个类。用于实例化Handler,解决handler的弱引用导致的内存泄漏问题。
1,先来看一段代码
public class AutoActivity extends Activity { Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_auto); }}
显而易见,handler是一个强引用对象,按我个人理解,一般new出来的对象都是强引用,只要在该变量的作用域内,该对象就不会被JVM主动回收,及时出现OOM时,JVM也不会去回收强引用的内存空间。上面这段代码会有警告:This Handler class should be static or leaks might occur,因为Handler一般用于在主线程刷新UI,会发送Message,一旦Activity.finish()后,Handler依然持有所关联的Activity的对象,这样就会造成内存泄漏。开源中国·丁佳辉的文章中有一句话:因为在java中所有非静态的对象都会持有当前类的强引用,而静态对象则只会持有当前类的弱引用。声明为静态后,handler将会持有一个Activity的弱引用,而弱引用会很容易被gc回收,这样就能解决Activity结束后,gc却无法回收的情况。
很好的解释了为什么Handler都会声明成static类型。WeakReference这个类可以很好的解决handler导致的内存泄漏问题。
private SwitchHandler mHandler = new SwitchHandler(Looper.getMainLooper(), this);class SwitchHandler extends Handler { private WeakReference<FirstActivity> mWeakReference; public SwitchHandler(Looper mLooper, FirstActivity activity) { super(mLooper); mWeakReference = new WeakReference<FirstActivity>(activity); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); Intent i = new Intent(FirstActivity.this, MainActivity.class); FirstActivity.this.startActivity(i); //activity切换的淡入淡出效果 overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); FirstActivity.this.finish(); }}
0 0
- Android中handler引用记录
- android handler 弱引用
- [有事没事记录一点]Android中,Handler的用法
- 记录 -- Android中的Handler总结
- Android中Handler定义
- Android中Handler作用
- android中handler案例
- Android中handler总结
- Android中Handler作用
- android 中handler小结
- Android中Handler总结
- Android中Handler类
- Android中Handler作用
- Android中Handler总结
- Android中使用handler
- Android中Handler学习
- android中关于handler
- Android中Handler机制
- Binder学习笔记(二)——defaultServiceManager()返回了什么?
- PS基础知识三
- Java内部类引用外部类中的局部变量为何必须是final问题解析
- 跟我一起学习MySQL技术内幕(第五版):(第三章学习日记4)
- Mysql下载与版本选择
- Android中handler引用记录
- fragment生命周期
- 怎样快速导入Anroid Studio 项目
- Linux查看机器负载
- mysql的多表连接
- Some Tips and Tricks about Qt
- PS基础知识六
- HDU 2114 Calculate S(n)(数学题)(数学公式)1^3+2^3+3^3+……+(n-1)^3+n^3=n^2(n+1)^2/4
- 文章标题