执行后台耗时操作的封装-----改进版
2017-01-17 15:59
162 查看
在之前写过一篇执行后台耗时操作封装:http://blog.csdn.net/u010047390/article/details/43982461
这这篇文章中会有一个黄色提示:This Handler class should
be static or leaks might occur
意思应该把这个handler定义成静态否则可能引起内存泄露。
我们再回顾前面的定义的方式:
Handler messageHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
switch (msg.what)
{
case UPDATE_UI:
try
{
updateUI();
}
catch (Exception e)
{
}
break;
default:
break;
}
}
}; 在这里我是直接用匿名内部类的方式去创建了一个类继承Handler,然后在这个类里面去执行了updateUI()方法。这个方法是属于外部类CommonHandle的,但是在内部类可以直接用,说明在这个类定义里隐含了一个外部类的引用。由于handler再消息队列中是存在引用的,生命周期可能长于CommonHandle这个类本身创建的实例需要的生命周期。
<_>这里可能关于生命周期有点晕了,我们就考虑我们用到CommonHandle的一个场景,去后台取数据时,我们先创建了CommonHandle,然后在start的时候启动线程去执行handData里面的耗时操作了。按常理讲,我们预想的CommonHandle的生命周期要到取完数据,然后执行完updateUI之后再结束。但是在网络慢的时候,用户可能直接关闭这个界面了,这个时候,我们是不希望任何地方再握有CommonHandle的引用的,但是messageHandler因为是在消息队列中存在引用的,所以这个一直未释放。所以对这个类我现在做了一个改进,首先把这个匿名内部类定义成静态的,这样就不会直接引用外部类了,然后需要用到这个类是,在构造的时候传入这个引用,这个引用采用软应用的方式,在内存不足的时候可直接释放。
private MyHandler messageHandler = new MyHandler(this);
/**
*
* <p>描 述:自定义处理UI更新类</p>
* <p>创 建 人:william</p>
* <p>创建时间:2017-1-17下午3:23:30</p>
*
*/
static class MyHandler extends Handler
{
WeakReference<CommonHandle> hand;
public MyHandler(CommonHandle commonHandler)
{
hand = new WeakReference<CommonHandle>(commonHandler);
}
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
switch (msg.what)
{
case UPDATE_UI:
try
{
if (hand.get() != null)
{
hand.get().updateUI();
}
}
catch (Exception e)
{
}
break;
default:
break;
}
}
};
这这篇文章中会有一个黄色提示:This Handler class should
be static or leaks might occur
意思应该把这个handler定义成静态否则可能引起内存泄露。
我们再回顾前面的定义的方式:
Handler messageHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
switch (msg.what)
{
case UPDATE_UI:
try
{
updateUI();
}
catch (Exception e)
{
}
break;
default:
break;
}
}
}; 在这里我是直接用匿名内部类的方式去创建了一个类继承Handler,然后在这个类里面去执行了updateUI()方法。这个方法是属于外部类CommonHandle的,但是在内部类可以直接用,说明在这个类定义里隐含了一个外部类的引用。由于handler再消息队列中是存在引用的,生命周期可能长于CommonHandle这个类本身创建的实例需要的生命周期。
<_>这里可能关于生命周期有点晕了,我们就考虑我们用到CommonHandle的一个场景,去后台取数据时,我们先创建了CommonHandle,然后在start的时候启动线程去执行handData里面的耗时操作了。按常理讲,我们预想的CommonHandle的生命周期要到取完数据,然后执行完updateUI之后再结束。但是在网络慢的时候,用户可能直接关闭这个界面了,这个时候,我们是不希望任何地方再握有CommonHandle的引用的,但是messageHandler因为是在消息队列中存在引用的,所以这个一直未释放。所以对这个类我现在做了一个改进,首先把这个匿名内部类定义成静态的,这样就不会直接引用外部类了,然后需要用到这个类是,在构造的时候传入这个引用,这个引用采用软应用的方式,在内存不足的时候可直接释放。
private MyHandler messageHandler = new MyHandler(this);
/**
*
* <p>描 述:自定义处理UI更新类</p>
* <p>创 建 人:william</p>
* <p>创建时间:2017-1-17下午3:23:30</p>
*
*/
static class MyHandler extends Handler
{
WeakReference<CommonHandle> hand;
public MyHandler(CommonHandle commonHandler)
{
hand = new WeakReference<CommonHandle>(commonHandler);
}
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
switch (msg.what)
{
case UPDATE_UI:
try
{
if (hand.get() != null)
{
hand.get().updateUI();
}
}
catch (Exception e)
{
}
break;
default:
break;
}
}
};
相关文章推荐
- 第一讲-------------执行后台耗时操作的封装
- Android拾萃 - RxJava实战(后台执行耗时操作,实时通知 UI 更新)
- WinForms中后台执行耗时的操作
- 如何在web页面中,实现耗时操作的后台执行?多线程吗?
- RxJava2 实战知识梳理(1) - 后台执行耗时操作,实时通知 UI 更新
- Winform开发中耗时操作封装用异步执行(.net 4.0)
- winform 开发中 把耗时操作 封装起来 异步执行(.net 4.0)
- Window Service 创建:在后台执行一个服务,可定时做一些操作,如轮询数据库,定时发邮件
- service是否在main thread中执行, service里面是否能执行耗时的操作?
- 关于异步更新UI界面多线程执行后台操作的一些思路整理
- 自定义事件分发,执行耗时操作服务
- 在Android中使用Handler和Thread线程执行后台操作
- Android面试题-Service是否在main thread中执行, service里面是否能执行耗时的操作?
- Android多线程,让耗时的操作去后台运行吧
- BackgroundWorker 组件用来执行诸如数据库事务、文件下载等耗时的异步操作
- 在Android中使用Handler和Thread线程执行后台操作
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
- Android中使用Handler和Thread线程执行后台操作
- ASP.NET服务器端执行耗时操作的工作记录
- 数据库操作封装--执行事务