如何暂停活动?

时间:2011-09-08 09:17:44

标签: android

我想在用户执行某些操作(例如长按)时暂停“事件线程”/活动,并在用户执行其他操作(简单点击)时取消暂停。问题是,在我长按一下后,事件线程进入等待队列。因此,当进行简单的点击时,不会被拦截。我该如何实现这一目标?请注意,我不想通过显示一些进度对话框等暂停活动,我想在前台保留我的活动并暂停。这是我尝试过的:/

 final Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                 synchronized(this){    
                     try {
                         this.notify();
                         } catch (Exception e) {
                    e.printStackTrace();
                }
                 }
            }
        });
      vg.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            try {
                 synchronized(this){    
                     this.wait();
                     }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return true;
        }
    });
      vg.setOnClickListener(new View.OnClickListener() {


        @Override
        public  void onClick(View v) {
             synchronized(this){    
                 t.start();}
        }

    });

3 个答案:

答案 0 :(得分:1)

正如其他人所说,由于各种原因,暂停活动的主要UI线程并不是一个好主意。

听起来你真正想做的是禁用各种UI元素而不是暂停活动。这可以通过调用要禁用/启用的各种元素上的setEnabled(boolean)来完成。

当用户点击“暂停”按钮时,您可以浏览所有UI元素并禁用它们(“取消暂停”按钮除外)。然后,当用户单击“取消暂停”按钮时,您将重新启用所有已禁用的元素。

修改 如果我理解你在寻找什么,这是一种暂停和取消暂停工作线程的方法。工作线程将在后台执行doA()和doB(),并且可以在每个之间暂停。您可以使用此方法添加更多功能甚至取消。


boolean mIsPaused = false;

final Thread workerThread = new Thread(new Runnable() {
   @Override
   public void run() {
      doA();
      checkPause();
      doB();
      checkPause();
      ...
   }
   }
});

private void checkPause() {
   while(isPaused()) {
      // you could also use the notify/wait pattern but that is probably needless complexity for this use case.
      Thread.sleep(50);
   }
}

private synchronized boolean isPaused() {
  return mIsPaused;
}

private synchronized void setPaused(boolean isPaused) {
  mIsPaused = isPaused;
}


pauseButton.setOnLongClickListener(new View.OnLongClickListener() {
   @Override
   public boolean onLongClick(View v) {
      // disable any UI elements that need it
      setIsPaused(true);
   }
});

unPauseButton.setOnLongClickListener(new View.OnLongClickListener() {
   @Override
   public boolean onLongClick(View v) {
      // re-enable any UI elements that need it
      setIsPaused(false);
   }
});

答案 1 :(得分:0)

这可能是一个愚蠢的解决方案,这是嵌入式系统的发展方向,尽管这肯定会降低性能。

class App extends Activity
{
private static boolean flag = true;

private void stopthread(){
while(flag){

}

}


private void handleUserEvent(){

//do your stuff and 

flag = false;
}
}

答案 2 :(得分:0)

主线程处理UI事件,因此如果你阻止它(通过sleep()),它就会停止处理事件。

因此,您无法阻止UI线程,并希望通过用户操作取消阻止它。