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