Activity中Handler潜在内存泄漏的问题

在activity的ui变更中,我们经常会使用到Handler来配合,但是这样的做法有一个潜在的内存泄漏问题,因为同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static那么使用Handler的Service和Activity就也无法被回收。这就可能导致内存泄露。当然这通常不会发生,除非你发送了一个延时很长的消息。

在Android Studio中经过语法检查一般会得到类似下面的一条警告

  • this Handler class should be static or leaks might occur
    官方的建议是把Handler改成静态的,这样就能避免无法回收的问题
static class ViewHandler extends Handler {   
  MainActivity mActivity;  
  public ViewHandler(MainActivity activity) {
       mActivity = new WeakReference<>(activity).get();  
 }   
@Override   
public void handleMessage(Message msg) {
       switch (msg.what) { 
          case SET_TEXT:  
                  mActivity.runTime_edt.setText(String.valueOf(ConfigData.getRunTime()));   
            break;     
    ....UI操作 
     }  
 }

使用的时候

ViewHandler viewHandler = new ViewHandler(MainActivity .this);
viewHandler.sendEmptyMessage(SET_TEXT);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容