Intereting Posts
Ящик навигации для переключения действий вместо фрагментов JsonSubTypes, список полиморфных объектов и Parcelable Получить информацию о значении браузера android и отобразить его на экране Как реализовать вкладки теперь, когда TabActivity устарела Наложение макета xml в пользовательский класс View Как использовать оболочку ADB при подключении нескольких устройств? Ошибка с «ошибкой: более одного устройства и эмулятора» Как найти широту и долготу от адреса? Как сделать Android-телефон Bluetooth-гарнитурой? Android Youtube Player Api завершает работу и создает Android Hierarchy Viewer не показывает тайминги для рендеринга Поражение игры Libgdx на Android Какое разрешение требуется для доступа к Интернету из приложения Android? Как иметь более широкую прокрутку изображения в фоновом режиме Какие файлы следует добавить к игнорированию SVN в проекте с помощью Android Studio Есть ли какая-либо инфраструктура приложений для Android, например, весна?

Как приостановить / возобновить поток в 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(); } }