可运行的帖子是否可以在运行它的视图上获得空引用?



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

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 方法后才会释放它。

最新更新