• 全部
  • 音视频
  • Camera
  • UI
  • SDK
  • Android Studio
  • 问答

关于Handler泄漏和弱引用的问题

luqing414 2016-03-09 04:26:09
非静态Handler可能导致泄漏,这也是讨论很久了,我想问的不是这个,而是解决方案中,基本都是说通过声明为静态的,完后里面用弱引用来对外部的activity来进行引用,这样就不影响外部的activity被回收,网上随便找的代码如下:

static class MyHandler extends Handler {
WeakReference<Activity > mActivityReference;

MyHandler(Activity activity) {
mActivityReference= new WeakReference<Activity>(activity);
}

@Override
public void handleMessage(Message msg) {
final Activity mActivity = mActivityReference.get();
if (mActivity != null) {
mImageView.setImageBitmap(mBitmap);
}
}
}

这里的mActivity是外部Activity的弱引用,而且GC时,如果一个对象只有弱引用,那无论内存是否充足,都会被回收,我想问的是,如果外部Activity被finish掉了,进行GC时,Activity就会被回收,那回收后程序中的mActivity就会为空,里面的逻辑 mImageView.setImageBitmap(mBitmap);也就不会执行了,那这样一来,避免内存泄漏是否有意义,因为回收外部Activity的时候,内存可能其实是充足的,回收后,handler里面的逻辑就不会被执行了,这样程序逻辑就会出现错误,只是降低了FC的可能性
...全文
286 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
爵小友 2017-08-17
引用 2 楼 tcmakebest 的回复:
在页面 onStop 的时候使用 handler.removeCallbacksAndMessages(null); 不就好了. * Remove any pending posts of callbacks and sent messages whose * <var>obj</var> is <var>token</var>. If <var>token</var> is null, * all callbacks and messages will be removed.
如果知道在结束的时候把handler任务给取消掉至空,那就不会出现内存泄漏了吧,设置弱引用还有什么意义?
回复
只为搞笑 2016-03-14
引用 8 楼 luqing414 的回复:
[quote=引用 6 楼 u010668114 的回复:] 你里面的程序逻辑是为了更新这个activity里的一个ImageView,但是这个activity已经被回收了,更新这个逻辑本来就没有意义,哪里存在逻辑错误一说呢?但如果你是强引用的这个activity,那么finish不会回收这个activity,这也就是内存泄漏,没有用的activity还一直占用着内存,这个才是错误,为什么说没有意义?你这个问题本来问得就有问题。
我这里的ImageView只是举一个例子,实际情况可能是一个比较耗时的操作,用户不会一直在这个界面等着,允许用户退出这个界面,但耗时操作要继续执行,不能因为Activity被回收就停止了[/quote] 那你所说的这种耗时任务,理因用Service来执行,看看service的定义,适合管理程序退出后,任然要继续执行的任务。这里就不该用activity来管理这类任务,因为activity引用着大量的资源,退出后不释放就是不合理。
回复
luqing414 2016-03-14
引用 6 楼 u010668114 的回复:
你里面的程序逻辑是为了更新这个activity里的一个ImageView,但是这个activity已经被回收了,更新这个逻辑本来就没有意义,哪里存在逻辑错误一说呢?但如果你是强引用的这个activity,那么finish不会回收这个activity,这也就是内存泄漏,没有用的activity还一直占用着内存,这个才是错误,为什么说没有意义?你这个问题本来问得就有问题。
我这里的ImageView只是举一个例子,实际情况可能是一个比较耗时的操作,用户不会一直在这个界面等着,允许用户退出这个界面,但耗时操作要继续执行,不能因为Activity被回收就停止了
回复
过儿丶 2016-03-11
好像是6L说的这样
回复
只为搞笑 2016-03-11
你里面的程序逻辑是为了更新这个activity里的一个ImageView,但是这个activity已经被回收了,更新这个逻辑本来就没有意义,哪里存在逻辑错误一说呢?但如果你是强引用的这个activity,那么finish不会回收这个activity,这也就是内存泄漏,没有用的activity还一直占用着内存,这个才是错误,为什么说没有意义?你这个问题本来问得就有问题。
回复
中才德创 2016-03-11
这个问题,基本上没明白人或者说的明白的人
回复
luqing414 2016-03-10
没人知道吗?
回复
翼德兄 2016-03-10
如果activity被销毁掉,handlemessage里就不该被执行了,因为aci如果真被回收了,它的imageview变量为null 内存充足与否都不允许有内存泄露的问题
回复
xingzhong128 2016-03-10
事实上弱引用对象会在gc时被回收有一个必要条件,那就是只有这一个弱引用引用了当前的对象,如果出了弱引用还有强引用(也就是不带任何修饰的引用),那么gc时肯定不会回收这个对象。actiivty的引用大部分情况下放在task队列里,这是个强引用,只要这个强引用在handler里的回调是弱引用就能得到对象,回调就会被执行;如果activity被销毁退栈了,那么activity的强引用不存在了,只剩下handler里的弱引用,gc会回收对象,这个时候回调其实已经没有意义了。
回复
tcmakebest 2016-03-10
在页面 onStop 的时候使用 handler.removeCallbacksAndMessages(null); 不就好了. * Remove any pending posts of callbacks and sent messages whose * <var>obj</var> is <var>token</var>. If <var>token</var> is null, * all callbacks and messages will be removed.
回复
相关推荐
发帖
Android
创建于2009-10-09

7.8w+

社区成员

移动平台 Android
申请成为版主
帖子事件
创建了帖子
2016-03-09 04:26
社区公告
暂无公告