2012-09-17 38 views
0

我正在做我的第一个android游戏,我的游戏线程有问题。事情是,当我暂停它,并按回或主页按钮,我得到一个错误。 “活动(在我的应用程序游戏)没有响应我的代码:?安卓主题暂停/恢复主屏幕按下后没有响应

public class GameLoopThread extends Thread { 
static final long FPS = 10; 
private GameView view; 
private boolean running = false; 

private Object mPauseLock; 
private boolean mPaused; 

public GameLoopThread(GameView view) { 
    this.view = view; 
} 

public void setRunning(boolean run) { 
    running = run; 
    mPauseLock = new Object(); 
    mPaused = false; 

} 

@Override 
public void run() { 
    long ticksPS = 1000/FPS; 
    long startTime; 
    long sleepTime; 
    while (running) { 
     Canvas c = null; 
     startTime = System.currentTimeMillis(); 
     try { 
      c = view.getHolder().lockCanvas(); 
      synchronized (view.getHolder()) { 
       view.onDraw(c); 
      } 
     } finally { 
      if (c != null) { 
       view.getHolder().unlockCanvasAndPost(c); 
      } 
     } 
     sleepTime = ticksPS - (System.currentTimeMillis() - startTime); 
     try { 
      if (sleepTime > 0) 
       sleep(sleepTime); 
      else 
       sleep(10); 
     } catch (Exception e) { 
     } 

     synchronized (mPauseLock) { 
      while (mPaused) { 
       try { 
        mPauseLock.wait(); 
       } catch (InterruptedException e) { 
       } 
      } 
     } 

    } 

} 

/** 
* Call this on pause. 
*/ 
public void onPause() { 
    synchronized (mPauseLock) { 
     mPaused = true; 
    } 
} 

/** 
* Call this on resume. 
*/ 
public void onResume() { 
    synchronized (mPauseLock) { 
     mPaused = false; 
     mPauseLock.notifyAll(); 
    } 
    } 
    } 

我在做什么错

+0

你能提供一个LogCat输出吗? –

+0

你在那里有一个while循环:while(mPaused){...你等待一次,那就够了,或者应该是。 – fonZ

+0

我不认为你必须这么多同步,因为那只适用于可以由多个线程修改的对象。 – fonZ

回答

0

最有可能您的应用程序正在试图当它恢复启动停止线程这导致一个错误,导致应用程序崩溃。

看看你的logcat日志来检查。

+0

它关于keyDispatchingTimedOut 09-17 21:50:30.716: – Korangar

+0

它暂停并恢复正常,但如果我暂停,并在按下de back或home按钮后出现错误。 – Korangar

+0

我以前有类似的问题,它不得不与View初始化线程有关,然后当它回到主页时,它被破坏,但视图一直试图启动它。这可能不是你遇到的问题。现在,我只是猜测:/(我会张贴作为评论,但不是50代表) – Clark

1

首先,你有没有尝试按,同时应用程序运行?如果应用程序仍在运行时,电源按钮你尝试之后重新打开应用程序,那么你的线程代码和表面类很好。要解决您的问题(主页按钮部分),请将此方法添加到您的appcompatactivity中。

public class Game extends AppCompatActivity { 
public int i = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(new YourSurfaceGame(this,"player1")); 
} 
//Add this override method to your appcompatactivity 
@Override 
protected void onStart() { 
    super.onStart(); 
    //Re-declare your surface game class is the main solution here 
    setContentView(new YourSurfaceGame(this,"player1")); 
} 

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

花了一个小时,对我来说,虽然我注意到一个奇怪的现象,当我按下HOME和POWER键之间比较解决按钮家庭问题。如果您尝试使用此代码并开始注意您的游戏进度已经消失,那么https://www.tutorialspoint.com/android/android_shared_preferences.htm就是答案。

我对其他游戏应用程序做了同样的事情,我的结论是正确的。按下家庭或电源按钮后,游戏暂停。实际上,如果你使用线程作为扩展,你会发现这个问题,当你在你的mainthread类中使用timertask作为扩展时,它是不同的。虽然,我从来没有尝试过。