- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用过 MediaProjection
创建 VirtualDisplay
截屏。后来,我试图释放virtualDisplay
,但它不起作用:
// create virtual display...
mVirtualDisplay = sMediaProjection.createVirtualDisplay(DISPLAY, mWidth, mHeight, mDensity,
VIRTUAL_DISPLAY_FLAGS, mImageReader.getSurface(), null, null);
// release it after taking screenshot successfully
if (mImageReader != null){
mImageReader.setOnImageAvailableListener(null, null);
if (mImageReader.getSurface() != null) {
mImageReader.getSurface().release();
}
mImageReader.close();
}
if (mVirtualDisplay != null) mVirtualDisplay.release();
if (sMediaProjection != null) sMediaProjection.unregisterCallback(MediaProjectionStopCallback.this);
mVirtualDisplay = null;
mImageReader = null;
几分钟后,我调用了这个函数
displayManager.getDisplays()
--> 我看到了一些没有发布的虚拟显示器。
最佳答案
1 行答案: virtualdisplay.release() 如果您创建 virtualdisplay 传递 null 作为回调参数,则不执行任何操作。
我发现这是一个非常令人沮丧的问题,因为我在网络上遇到的所有示例都为回调参数传递了 NULL,但在所有示例中,由于不清楚的 android 文档,调用 release() 却没有意识到它完全没有任何作用,因此内存泄漏。虽然我不得不提到我在旧的 Android 版本中没有发现这个问题
从 VirtualDisplay 源代码中找到了答案。
创建 VirtualDisplay 时,您需要创建 VirtualDisplay.Callback 并传递 is 作为参数,而不是 NULL。因为 virtualDisplay.release() 函数检查 token 是否为空。
https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/hardware/display/VirtualDisplay.java
VirtualDisplay.java
/**
* Releases the virtual display and destroys its underlying surface.
* <p>
* All remaining windows on the virtual display will be forcibly removed
* as part of releasing the virtual display.
* </p>
*/
public void release() {
if (mToken != null) { //mToken is the callback
mGlobal.releaseVirtualDisplay(mToken);
mToken = null;
}
}
所以在调用 createVirtualDisplay 之前,先创建一个 VirtualDisplay.Callback
VirtualDisplay.Callback mVirtualDisplayCallback = new VirtualDisplay.Callback() {
@Override
public void onPaused() {
super.onPaused();
}
@Override
public void onResumed() {
super.onResumed();
}
@Override
public void onStopped() {
super.onStopped();
}
};
mVirtualDisplay = mProjection.createVirtualDisplay("screen-mirror", mWidth, mHeight, mDensity, flags, mImageReader.getSurface(), mVirtualDisplayCallback, handler);
如果你去看 VirtualDisplay 类,你会发现这个变量和构造函数
VirtualDisplay.java
private IVirtualDisplayCallback mToken;
VirtualDisplay(DisplayManagerGlobal global, Display display,
IVirtualDisplayCallback token, Surface surface) {
mGlobal = global;
mDisplay = display;
mToken = token;
mSurface = surface;
}
构造函数上的 mToken/VirtualDisplay 回调是 release() 函数在调用之前检查它是否为空的那个 token
mGlobal.releaseVirtualDisplay(mToken);
这是非常令人沮丧的,因为 release() 函数文档根本没有提到这一点。
DisplayManager disp = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
Display[] allDisplays = disp.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
Log.e(TAG , text);
Log.e(TAG , "Display Count " + allDisplays.length);
for (Display dl : allDisplays) {
Log.e(TAG , "Display name: " + dl.getName() + " Display id: " + dl.getDisplayId());
}
关于android - 创建虚拟显示后调用 release() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65823544/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!