gpt4 book ai didi

java - 关闭并重新打开应用程序后,Android Canvas 游戏循环中断 onResume()

转载 作者:行者123 更新时间:2023-11-30 08:48:41 25 4
gpt4 key购买 nike

在全新安装的情况下,我第一次打开该应用程序时,确实没有遇到任何问题。但是,如果我要通过进程终止应用程序、强行停止或简单地按下主页按钮并重新启动应用程序,我会遇到一些问题...

第一个问题 - 当应用程序在关闭或终止后重新启动时,在实际启动应用程序窗口之前会有很长的延迟。此外,有时游戏图形(绘制到 Canvas 上的内容)显示最多需要 30 秒。当我听到游戏音效在后台播放时,我只会看到黑屏,就好像它正在运行一样。

第二个问题 - 在等待大约 30 秒让应用程序实际显示 Canvas 后,有时触摸监听器会取消注册或发生其他问题。我无法与游戏互动,就好像我的触摸没有注册一样。再一次,这只会在应用程序成功运行一次然后关闭/终止后重新启动时发生。

第三个问题 - 如果我不耐烦并且没有等待 Canvas 显示 30 秒,而是点击主页按钮或关闭“无响应”的应用程序,我总是得到一条错误消息,内容类似于“应用程序无响应,等等?强制关闭?”或“意外错误,应用已停止运行。”

所以这些问题让我相信这是我如何开始/重新启动/创建我的游戏循环的问题:

public class MainMenuActivity extends ActionBarActivity implements View.OnTouchListener{


MenuView menu;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
menu = new MenuView(this);
menu.setOnTouchListener(this);
setContentView(R.layout.activity_main_menu);

Button buttonplay = (Button)findViewById(R.id.buttonPlay);
buttonplay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchCanvas();
}
});
}

public void launchCanvas(){
setContentView(menu)
}


@Override
public boolean onTouch(View v, MotionEvent event) {
////do stuff
}
return true;
}


////////////////////////////////////////inner MenuView class

public class MenuView extends SurfaceView implements Runnable {

Thread t = null;
SurfaceHolder holder;
boolean ok;
Game game;

public MenuView(Context context){
super(context);
game = new Game(this);
holder = getHolder();
}

@SuppressLint("WrongCall")
@Override
public void run() {
while(ok){
if(!holder.getSurface().isValid()){
continue;
}

Canvas c = holder.lockCanvas();
onDraw(c);
holder.unlockCanvasAndPost(c);
}
}


public void onDraw(Canvas canvas){
canvas.drawARGB(255, 1, 5, 29);
game.draw(canvas);
}

public void pause(){
ok = false;
while(true){
try{
t.join();
}catch (InterruptedException e){
e.printStackTrace();
}
break;
}
t=null;
}
public void resume(){
ok = true;
t = new Thread(this);
t.start();
}



}
////////////////////////////////////////////////////end MenuView class`



@Override
protected void onPause() {
super.onPause();
menu.pause();
}

@Override
protected void onResume() {
super.onResume();
menu.resume();
}

关于如何修复的任何想法?

更新 - 发现潜在问题我相信我的问题的根源来自于不让我的线程 hibernate 。我在线程循环的每次迭代调用的 draw() 方法中添加了以下 try block :

try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}

虽然现在有点起伏不平,但我一直无法重现上述问题。

我刚刚从 10 毫秒更改为仅 hibernate 1 毫秒,它不再不稳定并且仍然无法重现问题。 1 毫秒似乎微不足道……为什么线程 hibernate 一小段时间是必要的?

最佳答案

我自己的基于 SurfaceView 的应用程序有一个单独的线程,其中运行两个方法:update() 和 draw()。但是,draw() 方法仅在 canvas != null 时运行。这是我与暂停和恢复相关的所有代码,除了运行此代码的 surfaceCreated(SurfaceHolder sh) {...}:

if(!thread.isAlive()) {
thread.setRunning(true);
thread.start();
}

如果这对你没有帮助,我整个框架的相关部分:

主.java:

将 MainView 设置为内容 View (setContentView(mainView))

MainView.java:

@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
Log.d(TAG, "Surface created");
tf = Typeface.create("Roboto", Typeface.BOLD);
recalc=true;
if(!thread.isAlive()) {
thread.setRunning(true);
thread.start();
}
}

主线程.java:

public class MainThread extends Thread {
// (abridged) Game logic loop
@Override
public void run() {
Canvas canvas;
Log.d(TAG, "Starting game loop");
while (running) {
canvas = null;
// try locking the canvas for exclusive pixel editing
// in the surface
try {
canvas = this.surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
// update game state
mainView.update();
// render state to the screen
if (canvas != null) mainView.render(canvas); // canvas == null when activity is in background.
// ... my code then handles sleeping, etc. for fixed fps.
}
} finally {
// in case of an exception the surface is not left in
// an inconsistent state
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}

希望这对您有意义!您应该能够根据需要对其进行调整以适应您自己的项目。

关于java - 关闭并重新打开应用程序后,Android Canvas 游戏循环中断 onResume(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31779254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com