Intereting Posts
Single TextView с несколькими цветными текстами Белые лейблы Android и приложений IOS Возможно ли резервное копирование и RESTORE файл базы данных в android? Не root-устройства RSS-канал для Google Play Store Показывать контекстное меню, когда ссылка длиннее нажата в TextView Нажмите кнопку Android, чтобы увидеть другое сообщение Toast, зависящее от количества кликов Android – установите фокус доступности AccessBack для определенного вида Как включить конфигурацию proguard в мою библиотеку Android (AAR) Как получить данные из класса курсора Android, что не так с openFileOutput? Динамически добавлять функции к Button onclicklistener Android Службы Google Play устарели. Требуется 9256000, но найдено 9080470 Как изменить размер буфера для потоковой передачи в андроид-видео? Как сделать http-сообщение с помощью apache httpclient с веб-аутентификацией? Ошибка AlarmManager при сбросе / отмене сигнала при изменении даты и времени

Перезапуск / приостановка потока в onResume / onPause

У меня есть игра, в которой используется реализация SurfaceView для отображения объектов. У меня есть поток, который время от времени выводит SurfaceView на экран. Игра работает полностью. К сожалению, он должен иметь функцию паузы всякий раз, когда игра прерывается. Ну, я знаю, что мне нужно манипулировать onResume и onPause .

Но я не могу понять. Ошибка возвращает меня обратно в surfaceCreated где я начинаю поток, сообщая мне, что поток уже начался. Я попытался использовать resume и suspend onResume и onPause соответственно, но ничего не изменилось.

Как я могу это достичь? Я уже сделал, как будет сохраняться местоположение объектов с помощью обработки файлов и ввода-вывода.

Заранее спасибо.

Не зная о том, что происходит с вашим кодом.

Чтобы «приостановить» поток, вы можете реализовать такие функции:

 while(! this.isInterrupted()) if(!paused) { ... Do something ... } else { try { Thread.sleep(100) } catch (InteruptedException ie) {} } 

Это зависит от того, делает Do something недействительным ваш поверхностный вид или иным образом контролирует прогрессию в вашем приложении. Аксессуар для paused должен позволить вам приостановить и возобновить поток, не попав в какой-либо другой бит архитектуры.

Это то, что я сделал:

  @Override public void surfaceCreated(SurfaceHolder arg0) { if (thread.getState() == Thread.State.TERMINATED){ CreateThread(getHolder(),getContext()); } thread.setRunning(true); thread.start(); } 
  • В CreateThread вы должны иметь thread = new MyThread (…);
  • SetRunning (boolean mRun) использует логическое значение для запуска / остановки функции запуска (я думаю, что я был вдохновлен LunarLander);

Если вы хотите правильно использовать onPause / onResume, не помещайте переменные, используемые вашим потоком внутри потока (как это сделано в LunarLander). Я предлагаю вам сделать так:

 // Variables declarations public MyGameThread CreateThread(...){ thread = new MyGameThread(holder, context, new Handler() { // and so on.... }); } 

Когда вы проходите через onPause / onResume, ваш поток будет уничтожен и обновлен, но если вы поместите свои переменные за его пределы, вы можете продолжать их использовать.

Если у вас есть что-то важное для сохранения, используйте один из следующих вариантов:

  • SharedPreferences: xml будет создан и сохранен локально с переменными, которые сохраняются даже после завершения приложения;
  • SQL db, если вы будете управлять более чем 5-10 переменными, потому что в этом случае использование прежнего варианта было бы затруднительным.

На самом деле не рекомендуется останавливать поток самостоятельно, метод stop() устарел. Самое простое решение – использовать флаг в цикле while внутри метода run() потока. Когда вам нужно «остановить» поток, вы просто поместите флаг в false, и поток больше ничего не сделает, несмотря на то, что он будет продолжать работать. Android остановит ваш поток, когда это необходимо. Надеюсь это поможет.

Я не уверен, если у вас есть один или два потока в этом вопросе, я предполагаю 2. Вам нужно сделать три вещи, когда вы вызываете onPause:

 1 - Save the state of the application (all game variables, states, etc) 2 - Kill the surfaceView by calling suspend. 3 - Kill the other thread (we'll call it Thread B). 

Думаю, убийство Thread B – ваша проблема. Вы хотите прервать поток и сказать ему выйти, или когда вы вызываете onPause, ваш поток все равно будет делать свое дело. Затем, когда вы вернетесь в игру, поток попытается создать снова, что вызовет проблему. Есть 2 способа правильно убить поток:

  • В цикле while() вашего потока булевой «run», который while(run) будет выполнять код. Когда вы меняете run на false, поток выходит.
  • Если ваш поток спит (я предполагаю, что это может произойти с момента его игры и будет работать по времени), поймайте InterruptedException и затем выйдите из него. Когда вы хотите убить поток, вы бросаете исключение в поток.

Первый – самый легкий.