微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐