当我们注册点击侦听器等作为常见做法时,我们会检查视图是否仍然存在,例如
final View someView = ...;
someView.setOnClickListener( (l) -> {
if(someView != null) {
// access view
}
});
因为当侦听器被调用时,视图可能已经丢失。
但在以下情况下:
View someView = ...;
someView.post(() -> {
// can someView be null here?
});
它实际上可以。如果您阅读文档:
将 Runnable 添加到消息队列中。可运行的 将在用户界面线程上运行。
View 类中的post()
方法将简单地将一个可运行对象添加到 MainThread 的 MessageQueue。这个可运行的视图将在某个时候运行,如果你的视图(活动(在此期间被破坏,在该可运行对象中使用someView可能会导致内存泄漏(它可能为空(。即使 someView 被销毁,可运行对象仍将保存对它的引用(空引用(,并且只有在执行 run 方法后才会释放它。