android - post runnable 能否在其运行的视图上获得空引用?
问题描述
当我们注册点击监听器等作为常见做法时,我们检查视图是否仍然存在,例如
final View someView = ...;
someView.setOnClickListener( (l) -> {
if(someView != null) {
// access view
}
});
因为在调用侦听器时,视图可能已经丢失。
但在以下情况下:
View someView = ...;
someView.post(() -> {
// can someView be null here?
});
解决方案
它实际上可以。如果您阅读文档:
使 Runnable 添加到消息队列中。runnable 将在用户界面线程上运行。
View 类中的post()
方法将简单地向 MainThread 的 MessageQueue 添加一个 runnable。这个runnable将在某个时候运行,如果你的视图(Activity)在此期间被破坏,在该runnable中使用someView可能会导致内存泄漏(它可能为null)。即使 someView 被销毁,runnable 仍然会持有对它的引用(空引用),并且只有在执行 run 方法后才会释放它。
推荐阅读
- c++ - 无法使用派生类访问类的私有成员的 C++ 代码
- android - 带有接口的 Android 存储库实现
- powershell - RDS 网关 > 使用 Powershell 更新资源授权策略
- spring-mvc - Send Data to HTML Template through Spring AOP?
- sql-server - 在 Microsoft SQL Server Management Studio 中创建作业
- highcharts - Highcharts 将带区绘制到电子表格数据中的最后一个日期时间值
- dialogflow-es - 我们可以在Dialogflow中显示列表响应后触发简单响应吗?
- magento2 - 如何在 Magento 2 中使用事件和观察者
- ruby-on-rails - Rails MSSQL 连接 - TinyTds::Error: 关闭连接
- javascript - 使用 Document.querySelector 从 p 获取文本,不包括跨度值