WindowManager.removeViewImmediate()
的文档包含警告(强调我的):
Special variation of
ViewManager.removeView(View)
that immediately invokes the given view hierarchy’sView.onDetachedFromWindow()
methods before returning. This is not for normal applications; using it correctly requires great care.
我很好奇究竟“非常谨慎”在这里意味着什么.据推测,这表明我不应该调用这种方法,除非我知道如何处理使用它的所有副作用……但我甚至不知道这些副作用可能是什么.
考虑以下活动,我尽可能将其作为香草制作.没有省略的代码(除了导入),而Activity的主题只是一个香草的AppCompat主题:
public class MainActivity extends AppCompatActivity {
private View overlay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getwindow().getDecorView().post(() -> {
overlay = new View(this);
overlay.setBackgroundColor(Color.RED);
WindowManager.LayoutParams params =
new WindowManager.LayoutParams(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getwindowManager().addView(overlay, params);
});
}
@Override
protected void onDestroy() {
super.onDestroy();
getwindowManager().removeView(overlay);
}
}
当我运行我的应用程序,并将我的设备从纵向旋转到横向(或任何其他导致它被销毁和重新创建),这将出现在logcat中:
06001
但是,如果我将onDestroy()方法改为使用removeViewImmedate(),那么此错误永远不会出现在我的日志中.不过,我对此犹豫不决,因为我不知道切换这些电话会对其他什么产生影响.只是说“它有效”并不足以让我放心.
解决方法:
WiNowManager由WindowManagerImpl实现.
WindowManagerImpl #removeViewImmediate(View)和WindowManagerImpl #removeView(View)都调用WindowManagerGlobal #removeView(View,boolean).
不同之处在于removeViewImmediate()将true传递给该boolean参数,该参数告诉WindowManagerGlobal应该立即删除该View而不是等待.
尽管如此,这可能是非常明显的.
我唯一可以想到的可能是立即删除一个问题是奇怪的绘图错误.虽然对源方法的评论如下:
/**
* @param immediate True, do Now if not in traversal. False, put on queue and do later.
* @return True, request has been queued. False, request has been completed.
*/
这没有多大意义.
老实说,如果它不会导致崩溃,而是删除泄漏警告,你也可以使用它.
WindowManagerGlobal#removeViewLocked(View, boolean)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。