如何在Android中暂停/恢复线程?

时间:2011-07-21 12:52:29

标签: android multithreading

我有一个运行到活动的线程。当用户点击主页按钮时,不希望线程连续运行,或者例如,用户接收到呼叫电话。 所以我想暂停线程并在用户重新打开应用程序时恢复它。 我试过这个:

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 个答案:

答案 0 :(得分:63)

使用锁定正确使用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();
        }
    }

}

答案 1 :(得分:4)

尝试下面的代码

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