首页 > 解决方案 > post runnable 能否在其运行的视图上获得空引用?

问题描述

当我们注册点击监听器等作为常见做法时,我们检查视图是否仍然存在,例如

final View someView = ...;  
someView.setOnClickListener( (l) -> {
  if(someView != null) {   
     // access view
  } 
});   

因为在调用侦听器时,视图可能已经丢失。
但在以下情况下:

View someView = ...;  
someView.post(() -> {
    // can someView be null here?  
});   

标签: androidandroid-layoutandroid-runonuithread

解决方案


它实际上可以。如果您阅读文档

使 Runnable 添加到消息队列中。runnable 将在用户界面线程上运行。

View 类中的post()方法将简单地向 MainThread 的 MessageQueue 添加一个 runnable。这个runnable将在某个时候运行,如果你的视图(Activity)在此期间被破坏,在该runnable中使用someView可能会导致内存泄漏(它可能为null)。即使 someView 被销毁,runnable 仍然会持有对它的引用(空引用),并且只有在执行 run 方法后才会释放它。


推荐阅读