活动从 SurfaceView 活动传递到它后释放

  • 本文关键字:活动 释放 SurfaceView android
  • 更新时间 :
  • 英文 :


有一个带有 SurfaceView 的活动和一个要在其上绘制的线程(来自此示例(。以下是GameSurface的定稿代码:

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
while(retry) {
try {
this.gameThread.setRunning(false);
this.gameThread.join();
}catch(InterruptedException e)  {
e.printStackTrace();
}
retry = true;
}
}

(不太明白重试总是正确的逻辑,放了一点,但没有积极的影响(

这是游戏线程:

package org.mineprogramming.laserminigolf;
import android.graphics.Canvas;
import android.util.Log;
import android.view.SurfaceHolder;
import java.util.logging.Logger;
public class GameThread extends Thread {
private boolean running;
private GameSurface gameSurface;
private SurfaceHolder surfaceHolder;
public GameThread(GameSurface gameSurface, SurfaceHolder surfaceHolder)  {
this.gameSurface = gameSurface;
this.surfaceHolder = surfaceHolder;
}
@Override
public void run()  {
long startTime = System.nanoTime();
while(running)  {
Canvas canvas= null;
try {
// Get Canvas from Holder and lock it.
canvas = this.surfaceHolder.lockCanvas();
// Synchronized
synchronized (canvas)  {
this.gameSurface.update();
this.gameSurface.draw(canvas);
}
}catch(Exception e)  {
// Do nothing.
} finally {
if(canvas!= null)  {
// Unlock Canvas.
this.surfaceHolder.unlockCanvasAndPost(canvas);
}
}
long now = System.nanoTime() ;
// Interval to redraw game
// (Change nanoseconds to milliseconds)
long waitTime = (now - startTime)/1000000;
if(waitTime < 10)  {
waitTime= 10; // Millisecond.
}
System.out.print(" Wait Time="+ waitTime);
try {
// Sleep.
this.sleep(waitTime);
} catch(InterruptedException ignored)  { }
startTime = System.nanoTime();
System.out.print(".");
}
}
public void setRunning(boolean running)  {
this.running= running;
}
}

现在我开始一些其他活动:

Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);

并且此活动没有响应(但是显示(。 也尝试启动它以获得结果。 通过 finish(( 从我的 SurfaceView 活动返回到另一个活动时,情况也是如此。

调试了一会儿后,我看到活动的初始化成功,稍后在某个地方冻结

好的,就是这样。重试始终为真。这种最终确定的变体帮助了我:

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
while(retry) {
try {
this.gameThread.setRunning(false);
this.gameThread.join();
retry = false;
}catch(InterruptedException e)  {
e.printStackTrace();
}
}
}

不确定它是最好的,但它对我有用。

最新更新