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

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

Ответ 1

Используйте 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();
        }
    }

}

Ответ 2

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

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();
}
}