Как приостановить / возобновить поток в Android? - PullRequest
32 голосов
/ 21 июля 2011

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

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() поток не останавливается.

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

Ответы [ 2 ]

63 голосов
/ 21 июля 2011

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

}
4 голосов
/ 21 июля 2011

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

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();
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...