【问题标题】:Does a SurfaceTexture survive an activity pause/resume cycle?SurfaceTexture 是否能在活动暂停/恢复周期中存活?
【发布时间】:2016-01-10 16:51:31
【问题描述】:

下面是我做的一个小实验,我在活动的 onResume() 部分将 SurfaceTextureListener 附加到 TextureView。

  • 重新开始:表面纹理可用(“onSurfaceTextureAvailable”)

  • 方向改变:正如我所料,表面纹理被破坏(“onSurfaceTextureDestroyed”),然后表面纹理可用(“onSurfaceTextureAvailable”)。

现在让我感到惊讶的是:

  • 在任务切换然后恢复:表面纹理没有被破坏(没有“onSurfaceTextureDestroyed”)并且表面纹理不可用(没有“onSurfaceTextureAvailable”)

在这些条件下,我能保证旧的 SurfaceTexture 仍然有效吗?如何确保我真正知道我的 SurfaceTexture 何时可用?为什么方向改变与任务切换不同,我应该怎么知道?


public class MainActivity extends AppCompatActivity {
    private final String TAG = "MainActivity";
    TextureView mTextureView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextureView = (TextureView) findViewById(R.id.textureView);
     }

    @Override
    public void onResume() {
        super.onResume();
        mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
            @Override
            public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
                Log.d(TAG, "onSurfaceTextureAvailable");
            }
            @Override
            public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
                Log.d(TAG, "onSurfaceTextureSizeChanged");
            }
            @Override
            public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
                Log.d(TAG, "onSurfaceTextureDestroyed");
                return false;
            }
            @Override
            public void onSurfaceTextureUpdated(SurfaceTexture surface) {
            }
        });
    }
}

【问题讨论】:

    标签: android


    【解决方案1】:

    我想说这不是问题,也不是“正常”或“预期的”行为。这与设备的硬件以及系统如何处理资源使用过载或硬件更改有很大关系。

    如果您的设备有一个非常灵活的图形加速器,那么您的表面可能会在方向变化后幸免于难。看到当设备被命名时,视频模式完全改变并记住那些为桌面设备编程的时间,当视频模式从桌面窗口变为全屏或反之亦然。

    同样的事情发生在,也许您的应用程序是一个资源使用量很大的游戏,它耗尽了所有视频内存量,例如用于纹理或后备缓冲区的表面,等等...如果您切换到另一个应用程序并使用这个新应用程序需要表面空间,您的部分或全部视频内存应该被杀死以使这个新屏幕正常工作。

    因此...你看到了吗?...可能发生的情况是您没有使用全部视频内存,或者只是您拥有一个带有最新软件的坏蛋设备,可以同时处理这两种情况light 或 soft 更改不会破坏您的资源。

    我的,否则无用的演讲的寓意是,您必须处理破坏,以防它被破坏,即使它从未在您的设备中发生,或者您将有很多异常尝试锁定画布或渲染空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2017-02-10
      相关资源
      最近更新 更多