Intereting Posts
Как установить пустой доступный Android: получение ошибки: не удалось преобразовать формат Dalvik Android.text.format.DateFormat «HH» не распознается как с java.text.SimpleDateFormat Почему в некоторых телефонах произошла ошибка «Это приложение было построено с неправильной конфигурацией»? E / SelfBrailleClient (11344): не удалось привязать к сервису Каковы значения по умолчанию для соединений и тайм-аутов сокетов в DefaultHttpClient на Android? Android: configChanges, кажется, игнорируется Добавьте предварительно созданные .so файлы в проект с помощью Android Gradle plugin 0.7.3 Android Wifi Direct: предотвращение принятия пользователем при подключении к известному партнеру Как я могу получить в круглых скобках значение в строке Не удалось выполнить цель com.jayway.maven.plugins.android.generation2 Android 4+ html5 canvas не перерисовывается CustomDrawerLayout с четырех сторон экрана выдают с жестом Fling и обнаружением Снять apk с различным хранилищем ключей Ошибка: плагин с id 'com.github.dcendents.android-maven' не найден

Как приостановить / возобновить поток в Android?

У меня есть поток, который работает в активности. Я не хочу , чтобы потоки продолжались, когда пользователь нажимал кнопку «домой» или, например, пользователь получал телефон вызова. Поэтому я хочу приостановить поток и возобновить его, когда пользователь снова откроет приложение. Я пробовал с этим:

protected void onPause() { synchronized (thread) { try { thread.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } super.onPause(); } protected void onResume() { thread.notify(); super.onResume(); } 

Он останавливает поток, но не возобновляет его, поток кажется замороженным.

Я также пробовал использовать устаревший метод Thread.suspend() и Thread.resume() , но в этом случае в Activity.onPause() поток не останавливается.

Кто-нибудь знает решение?

Solutions Collecting From Web of "Как приостановить / возобновить поток в Android?"

Используйте wait() и notifyAll() правильно, используя блокировку.

Образец кода:

 class YourRunnable implements Runnable { private Object mPauseLock; private boolean mPaused; private boolean mFinished; public YourRunnable() { mPauseLock = new Object(); mPaused = false; mFinished = false; } public void run() { while (!mFinished) { // Do stuff. 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(); } } } 

Попробуйте приведенный ниже код, он будет работать

 Thread thread=null; 

OnResume ()

  public void onResume(){ super.onResume(); if(thread == null){ thread = new Thread() { @Override public void run() { try { } } catch (InterruptedException e) { e.printStackTrace(); } } }; thread.start(); } } 

OnPause ()

 @Override public void onPause(){ super.onPause(); if(thread != null){ Thread moribund = thread; thread = null; moribund.interrupt(); } }