Блокировка экрана в Android ускоряет игру - PullRequest
2 голосов
/ 25 июля 2011

Я обновляю свою игру с помощью обработчика, публикующего отложенный Runnable.

public class Example implements Runnable
{
  Handler handler;
  public Example()
  {
    handler = new Handler();
    handler.postDelayed(this,10);
  }
  public void run()
  {
    handler.postDelayed(this,10);
  }
}

Всякий раз, когда я нажимаю кнопку блокировки экрана и затем возобновляю игру, она запускается намного быстрее, чем предполагалось. Каждый раз, когда я блокирую экран и возобновляю его работу, он работает все быстрее и быстрее. Однако если я перезапущу действие или завершу, а затем снова открою действие, оно снова будет выполняться с нормальной скоростью. Помогите, пожалуйста. Заранее спасибо.

1 Ответ

3 голосов
/ 26 июля 2011

Кажется, что происходит каждый раз, когда вы блокируете экран, а затем возобновляете его, делая еще один Runnable поверх Runnable, у вас уже есть удвоение цикла, таким образом, заставляя поток двигаться быстрее и быстрее каждый раз, когда вам нужно чтобы как-то приостановить ваш поток, например, thread.sleep() или что-то подобное, когда вы блокируете экран, чтобы при возобновлении вы не воссоздали новый Runnable, а вместо этого просто начали с того места, где остановились в своем потоке.

Если вы делаете новый Runnable методом onCreate. Он будет вызываться в любое время, когда телефон поворачивается, или когда телефон возобновляет работу и т. Д., И именно поэтому у вас, вероятно, возникает эта проблема. Причина, по которой это не происходит после finish() вашей активности или закрытия приложения, заключается в том, что при перезапуске приложения Runnable будет создан один раз, пока вы не начнете блокировать телефон и не возобновите его снова и т. Д.

вы также можете захотеть взглянуть на внутренний класс, который вы можете использовать для обработки ваших потоков:

public class YourClass extends Activity {

    public void yourUpdateMethod() {
        runOnUiThread(new Runnable() {
            public void run() {
                new YourUpdateClass().execute(0, null, null);
            }
        });
    }

    private class YourUpdateClass extends AsyncTask<Integer, Void, Void> {


            @Override
            protected synchronized Void doInBackground(Integer... index) {
                return null;
            }

            @Override
            protected synchronized void onPostExecute(Void result) {
                //your statements here
            }
    }
}

Это может помочь обработать потоки, которые должны быть приостановлены / перезапущены / возобновлены или что-то немного лучше. Более подробная информация здесь: http://developer.android.com/reference/android/os/AsyncTask.html

Не знаю, как это будет работать в игре, но с этим не поиграл.

Удачи, надеюсь, это поможет.

...