gpt4 book ai didi

android - Android什么时候认为窗口泄漏了?

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:28 24 4
gpt4 key购买 nike

查看了Android源码,发现有如下方法。(core/java/android/view/WindowManagerGlobal.java)

似乎当 who != null 窗口/ View 泄漏时。谁能解释这背后发生了什么?

public void closeAll(IBinder token, String who, String what) {
synchronized (mLock) {
int count = mViews.size();
//Log.i("foo", "Closing all windows of " + token);
for (int i = 0; i < count; i++) {
//Log.i("foo", "@ " + i + " token " + mParams[i].token
// + " view " + mRoots[i].getView());
if (token == null || mParams.get(i).token == token) {
ViewRootImpl root = mRoots.get(i);

//Log.i("foo", "Force closing " + root);
if (who != null) {
WindowLeaked leak = new WindowLeaked(
what + " " + who + " has leaked window "
+ root.getView() + " that was originally added here");
leak.setStackTrace(root.getLocation().getStackTrace());
Log.e(TAG, "", leak);
}

removeViewLocked(i, false);
}
}
}
}

最佳答案

我检查了来源...我对此不是很确定,但我的理解是她...

“who”参数仅是 Activity 名称

查看closeAll()调用方法,可以看到who就是被销毁后留下一个窗口的Activity类名:

WindowManagerGlobal.getInstance().closeAll(wtoken,
r.activity.getClass().getName(), "Activity");

如果发生泄漏则调用 closeAll()

似乎是在 Windows 已经泄漏时调用了 WindowManagerGlobal.closeAll()。所以,who != null 只是检查以确保 String 不是 NULL

如果不为空,则创建一个 WindowLeaked 并打印日志。 WindowLeaked 是一个扩展 AndroidRuntimeException

的类
final class WindowLeaked extends AndroidRuntimeException {
public WindowLeaked(String msg) {
super(msg);
}
}

最重要的是,如果 WindowManagerGlobal.closeAll() 被调用,则意味着 Windows 已经泄漏。

CloseAll()调用方法

View.java 中,我们可以看到当检测到泄漏时会调用 WindowManagerGlobal.closeAll():

ActivityThread.java

private void handleDestroyActivity(IBinder token, boolean finishing,
int configChanges, boolean getNonConfigInstance) {
...
IBinder wtoken = v.getWindowToken();
...
if (wtoken != null && r.mPendingRemoveWindow == null) {
WindowManagerGlobal.getInstance().closeAll(wtoken,
r.activity.getClass().getName(), "Activity");
}

在上面的代码中,我们可以看到 WindowManagerGlobal.closeAll() 在发现不一致时被触发:

  1. wtoken != null wtoken 表示View有一个mAttachInfo.mWindowToken信息。换句话说,它仍然由某个窗口持有。
  2. r.mPendingRemoveWindow == null 没有待删除的 View 。

所以,这是不一致的。附加了一个 View (还有 mAttachInfo),但我已经删除了所有挂起的窗口(mPendingRemoveWindow 为空)...因此,该 View 已泄漏。

希望能帮到你问候

引用:

WindowManagerGlobal

ActivityThread

View

关于android - Android什么时候认为窗口泄漏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38155035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com