android – 正确使用WindowManager.removeViewImmediate()

WindowManager.removeViewImmediate()的文档包含警告(强调我的):

Special variation of ViewManager.removeView(View) that immediately invokes the given view hierarchy’s View.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)

ViewRootImpl#die(boolean)

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...