Intereting Posts
PhotoViewAttacher очищает границы изображения и масштабирования Как я могу отсортировать список getScanResults () на основе силы сигнала в порядке возрастания? Android Studio Warning: использование несовместимых плагинов для обработки аннотаций Можно ли использовать подпапки в drawables в Android? Как установить изображение в imageView, используя путь к файлу в android Запуск Android Studio на Windows 7 не удался, Android SDK не найден Javax.net.ssl.SSLPeerUnverifiedException: нет сертификата peer, пока я работаю с google place api в android Запустить приложение для Android от ссылки в sms Gradle 2.3.0-alpha1 не работает с привязкой данных Невозможно отобразить 2 экземпляра моего пользовательского SurfaceView Временные решения Остановить удаление приложения Не удалось выполнить запрос инвентаризации: ошибка обновления запасов Привести диалог сопряжения Bluetooth с передней панелью Как обрабатывать параметры, которые могут быть ARRAY или OBJECT в Retrofit на Android?

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

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

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

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

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

Solutions Collecting From Web of "Перезапуск / приостановка потока в 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 и затем выйдите из него. Когда вы хотите убить поток, вы бросаете исключение в поток.

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