【问题标题】:How to pause/resume thread in Android?如何在 Android 中暂停/恢复线程?
【发布时间】:2011-07-21 12:52:28
【问题描述】:

我有一个线程正在运行一个活动。我不希望当用户单击主页按钮或例如用户接听电话时线程继续运行。 所以我想暂停线程并在用户重新打开应用程序时恢复它。 我试过这个:

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(),线程不会停止。

有人知道解决办法吗?

【问题讨论】:

    标签: android multithreading


    【解决方案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();
            }
        }
    
    }
    

    【讨论】:

    • 它运行了,谢谢!但是为什么我必须将对象上的waitnotifyAll 方法调用到线程中而不是直接在线程对象上呢?
    • (1) 是否可以在 IntentService 中使用上述代码而不是 Runnable? (2) 为什么不是mPauseLock.notify() 而不是notifyAll()?
    • 谢谢你,但是每当我为我的应用程序运行它时,它会以 FATAL EXCEPTION: THREAD-10 和空指针异常退出。
    • 我在哪里设置延迟...runnable每转“运行”多快?
    【解决方案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();
    }
    }
    

    【讨论】:

    • 这看起来很简单.. 会不会出现问题?为什么不只是thread.interrupt?是先取消其他对它的引用还是什么的?
    • 好吧,它不是暂停/恢复。它正在破坏/重建。可以成为 android 上的性能杀手,它打开了 Auto Screen Rotation,用户将不断摇动设备导致屏幕自动旋转。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多