surfaceDestroyed什么时候被调用

surfaceDestroyed()是Android中SurfaceView类的一个回调方法,用于通知应用程序Surface已经被销毁了。当Surface被销毁时,它不再能够被使用,所以通常要进行一些清理工作,比如释放绘图上下文,回收不再使用的资源等。在此方法内完成这些操作可以防止应用程序的资源浪费和一些潜在的内存泄露问题。

当SurfaceView被销毁,surfaceDestroyed()回调方法将被调用。这可能发生在以下情况下:

1. 当应用程序的Activity被销毁时,所有的SurfaceView都将被销毁,此时surfaceDestroyed()会被调用。

2. 当SurfaceView被遮盖,比如由另一个Activity或者对话框覆盖时,SurfaceView也会被销毁,此时surfaceDestroyed()会被调用。

3. 当设备方向发生改变时,屏幕会旋转,SurfaceView也会被销毁,此时surfaceDestroyed()会被调用。

在使用SurfaceView时,必须重写surfaceDestroyed()方法并在其中完成必要的资源清理工作,防止内存泄露等问题的出现。下面是一个简单的例子:

```

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {

private SurfaceHolder mHolder;

public MySurfaceView(Context context, AttributeSet attrs) {

super(context, attrs);

mHolder = this.getHolder();

mHolder.addCallback(this);

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// 释放绘图上下文等相关资源

}

}

```

在上述代码中,我们重写了SurfaceHolder.Callback接口中的surfaceDestroyed()方法,并在其中添加了释放绘图上下文等资源的代码。

下面是另一个更复杂的例子,展示如何管理SurfaceView的生命周期:

```

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {

private SurfaceHolder mHolder;

private MyThread mThread;

private boolean mIsRunning = false;

public MySurfaceView(Context context, AttributeSet attrs) {

super(context, attrs);

mHolder = this.getHolder();

mHolder.addCallback(this);

}

// 开始绘制线程

public void startDraw() {

if (mThread == null || !mIsRunning) {

mThread = new MyThread();

mThread.start();

mIsRunning = true;

}

}

// 停止绘制线程

public void stopDraw() {

if (mThread != null) {

mIsRunning = false;

try {

mThread.join();

} catch (InterruptedException e) {

e.printStackTrace();

}

mThread = null;

}

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

// 绘制线程在此启动

startDraw();

}

@Override

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

// 更新SurfaceView的大小和格式等信息

// 并在更新前停止绘制线程

stopDraw();

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// 在Surface销毁时停止绘制线程

stopDraw();

// 释放绘图上下文等相关资源

}

private class MyThread extends Thread {

@Override

public void run() {

while (mIsRunning) {

// 执行绘制操作,不断更新SurfaceView上面的图像

}

}

}

}

```

在上述代码中,我们实现了SurfaceHolder.Callback接口,并在surfaceCreated()方法中启动绘制线程,在surfaceChanged()方法中停止绘制线程并更新SurfaceView的大小和格式等信息,在surfaceDestroyed()方法中停止绘制线程并释放绘图上下文等资源。在MyThread线程中执行绘制操作,具体实现可以根据需要进行调整。通过这种方式,我们可以更好地管理SurfaceView的生命周期,防止资源浪费和内存泄露等问题的出现。

总结来说,surfaceDestroyed()方法在SurfaceView被销毁时被调用,用于释放绘图上下文等相关资源。对于任何使用SurfaceView的应用程序来说,此方法都应该被重写,并适当地管理SurfaceView的生命周期,以确保应用程序的性能和稳定性。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(76) 打赏

评论列表 共有 0 条评论

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