【问题标题】:android thread pause /resume not responding after home button pressed按下主页按钮后,android线程暂停/恢复没有响应
【发布时间】:2012-09-17 21:40:13
【问题描述】:

我正在制作我的第一个 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();
     }
   }
  }

我做错了什么?

【问题讨论】:

  • 你能提供一个 LogCat 输出吗?
  • 你有一个while循环:while (mPaused) { ...你等一次,够了,或者应该够了。
  • 而且我不认为你必须给你这么多同步,因为那只适用于可以被多个线程修改的对象。
  • 您还有其他方法可以暂停和恢复线程吗?这是我在网上找到的代码组成的
  • 我看到的第一个问题是私有字段“运行”不是易失性的。编译器可能会假设,因为没有其他线程会修改它,所以只需内联代码。

标签: android multithreading resume pausing-execution


【解决方案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();
}
}

我花了几个小时才解决了按钮主页问题,但当我比较按下主页按钮和电源按钮时,我发现有些奇怪。如果您尝试此代码并开始注意到您的所有游戏进度都消失了,那么https://www.tutorialspoint.com/android/android_shared_preferences.htm 就是答案。

我对其他游戏应用程序做了同样的事情,我的结论是正确的。按下主页或电源按钮后,游戏会暂停。实际上,如果您使用线程作为扩展,您会发现这个问题,而当您在主线程类中使用 timertask 作为扩展时,情况就不同了。不过,我以前从未尝试过。

【讨论】:

    【解决方案2】:

    您的应用程序很可能在恢复时尝试启动已停止的线程。这会导致错误并导致您的应用程序崩溃。

    查看您的 Logcat 日志以进行检查。

    【讨论】:

    • 关于 keyDispatchingTimedOut 09-17 21:50:30.716:
    • 它暂停并恢复得很好,但是如果我暂停并且在我按下de返回或主页按钮后出现错误。
    • 我之前也遇到过类似的问题,它与视图初始化线程有关,然后当它回到家时它被破坏了,但视图一直试图启动它。这可能不是你遇到的问题。现在我只是在猜测:/(我会作为评论发布,但还没有 50 个代表)
    • 有没有游戏线程暂停和恢复示例代码我可以研究一下?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多