Android SurfacetTexture是否在活动暂停/恢复周期后仍然有效?

Android SurfacetTexture是否在活动暂停/恢复周期后仍然有效?,android,Android,下面是我做的一个小实验,我在活动的onResume()部分将一个SurfaceTextReliestener附加到一个TextureView 重新开始时:表面纹理可用(“onSurfaceTextureAvailable”) 关于方向更改:正如我所预期的,表面纹理将被破坏(“OnSurfaceTextureDistrocted”),然后表面纹理将可用(“onSurfaceTextureAvailable”) 现在让我吃惊的是: 在任务开关上,然后继续:表面纹理未被破坏(无“OnSurfac

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

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

  • 关于方向更改:正如我所预期的,表面纹理将被破坏(“OnSurfaceTextureDistrocted”),然后表面纹理将可用(“onSurfaceTextureAvailable”)

现在让我吃惊的是:

  • 在任务开关上,然后继续:表面纹理未被破坏(无“OnSurfaceTextureDistromed”),且表面纹理不可用(无“onSurfaceTextureAvailable”)
在这些条件下,我是否保证旧的SurfaceTexture仍然有效?如何确保我真正知道我的SurfaceTexture何时可用?为什么方向改变不同于任务切换?我该如何知道?



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

如果您的设备有一个非常灵活的图形加速器,那么您的曲面可能会经受住方向的变化。请注意,当设备标题为“视频模式”时,视频模式会完全改变,并且请记住,当视频模式从桌面窗口更改为全屏或其他模式后,必须重新创建所有DirectX表面(表面为视频内存)时,桌面设备的编程时间

同样的情况也会发生,也许你的应用程序是一个资源使用量很大的游戏,它会耗尽所有的视频内存,比如纹理或后缓冲层的表面等等。。。如果您切换到另一个应用程序,而这个新应用程序需要表面空间,则应关闭部分或全部视频内存,以使这个新屏幕正常工作

因此。。。你看到了吗?。。。可能会发生这样的情况:你没有用掉全部的视频内存,或者你有一个最新的软件,可以处理轻微或轻微的变化而不破坏你的资源

我的演讲的寓意是,你必须处理销毁,以防它被销毁,即使它从未在你的设备中发生过,否则你会有很多异常试图锁定画布或在null上渲染

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) {
            }
        });
    }
}