surfaceDestroyed什么时候被调用

surfaceDestroyed函数是Android系统中一个被回调的函数,用于通知应用程序(surface view)已经不再需要被绘制,此时可以进行一些资源的释放、清除等操作。这个函数在surface view被销毁时被调用,例如当用户退出应用程序时,或者在内存不足的情况下,Android系统需要回收一些资源,销毁当前activity并释放所有相关的surface view。此时,系统会调用surfaceDestroyed函数来告诉开发者,可以对surface view进行回收资源和清除等操作了。下面我们将对surfaceDestroyed进行详细介绍,包括方法的使用、调用时机、以及实际用例的讲解。

方法的使用

在Android中,surfaceDestroyed函数是属于SurfaceHolder.Callback接口的方法。因此,要使用这个函数,首先要实现SurfaceHolder.Callback接口,然后在相应的surfaceHolder中注册回调函数。下面是一个简单的代码示例:

```java

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {

private SurfaceHolder mSurfaceHolder;

// 构造函数

public MySurfaceView(Context context) {

super(context);

mSurfaceHolder = getHolder();

mSurfaceHolder.addCallback(this);

}

// SurfaceHolder.Callback接口回调方法

@Override

public void surfaceCreated(SurfaceHolder holder) {

// TODO

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

// TODO

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// TODO

}

}

```

在以上代码中,我们实现了SurfaceHolder.Callback接口,并在构造函数中将回调函数注册到了mSurfaceHolder中。其中,surfaceDestroyed函数在surface view销毁时被回调。

调用时机

当一个surface view被销毁时,系统会自动调用surfaceDestroyed函数。surface view的销毁可能有多种原因,例如:

- 用户点击“返回键”退出应用程序

- Activity因为内存不足而被销毁

- 设备屏幕方向切换等

无论什么情况,当surface view被销毁时,都会调用surfaceDestroyed函数。此时,开发者可以根据需要,释放相关的资源,清除surface view上已经绘制的内容等。

实际用例

下面我们以一个实际的应用场景来讲解surfaceDestroyed的用例。

场景描述:

我们的应用程序是一个摄像头应用程序,用户可以打开摄像头,预览摄像头的画面,然后录制视频。在录制视频的过程中,由于内存不够,Android系统需要回收一些资源,销毁当前activity并释放所有相关的surface view。

实现步骤:

1.在MySurfaceView中实现surfaceDestroyed函数,释放camera相关的资源

```java

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// 关闭camera

if (mCamera != null) {

mCamera.stopPreview();

mCamera.release();

mCamera = null;

}

}

```

2.在录制视频过程中,在Activity的onPause函数中释放MySurfaceView的资源。

```java

@Override

protected void onPause() {

super.onPause();

// 停止录制视频

if (mMediaRecorder != null) {

mMediaRecorder.stop();

mMediaRecorder.reset();

mMediaRecorder.release();

mMediaRecorder = null;

}

// 释放surface view

if (mSurfaceView != null) {

mSurfaceView.getHolder().removeCallback(mSurfaceView);

mSurfaceView = null;

}

}

```

3.在Activity销毁时,释放相关资源

在Activity销毁时,同样需要释放一些资源,包括camera、media recorder、surface view等。以下是一个Activity销毁时的例子:

```java

@Override

protected void onDestroy() {

super.onDestroy();

// 停止录制视频

if (mMediaRecorder != null) {

mMediaRecorder.stop();

mMediaRecorder.reset();

mMediaRecorder.release();

mMediaRecorder = null;

}

// 释放camera

if (mCamera != null) {

mCamera.stopPreview();

mCamera.release();

mCamera = null;

}

// 释放surface view

if (mSurfaceView != null) {

mSurfaceView.getHolder().removeCallback(mSurfaceView);

mSurfaceView = null;

}

}

```

总结

surfaceDestroyed是一个非常重要的回调函数,它在surface view销毁时被调用,可以让开发者释放相关的资源、清除surface view上已经绘制的内容等。在实际的应用场景中,我们可以根据需要,实现surfaceDestroyed函数,来释放相应的资源。同时,在Activity销毁时,我们也需要释放相关的资源,以避免内存泄漏等问题。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(42) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部