如何暂停活动?

问题描述:

我想暂停“事件线程”/活动,只要用户做一些动作(例如长按),并在用户做一些其他动作(简单点击)时取消暂停。问题是,在我长时间点击之后,事件线程进入等待队列。所以当做一个简单的点击,那是不会被拦截的。我如何实现这一目标?请注意,我不希望通过展示一些进度对话框等暂停活动,我想保留我的活动前景和获得paused.here是我曾尝试:/如何暂停活动?

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

    }); 
+1

所有UI事件都发生在一个线程中,所以在该线程上调用等待将导致所有事件在队列中等待。因此,您的应用将陷入僵局。我没有看到任何做这项工作的方式。 – Ronnie

+0

@ userSeven7s:我认为我不会称之为死锁,它只是让主线程等待,并且有人应该在该对象上调用通知,以便某人可能是另一个非事件或后台线程,所以它不是僵局。在我的情况下,我发送主线程处于睡眠状态(不能听“任何东西”)。 –

+0

如果您的应用程序在5秒内不响应,那么操作系统会显示一个对话框消息,这只是表示其不可靠的做事方式。它不是用户友好的,并且会令用户感到沮丧。我没有看到有任何需要这样做。 – ngesh

是一个愚蠢的解决办法做到这一点,这是嵌入式系统的走向,尽管这肯定会降低性能。

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

private void stopthread(){ 
while(flag){ 

} 

} 


private void handleUserEvent(){ 

//do your stuff and 

flag = false; 
} 
} 

主线程处理UI事件,所以如果你阻止它(通过sleep())不再处理事件。

所以你不能阻塞UI线程,并期望通过用户操作来解除阻塞。

正如其他人所说,暂停由于各种原因,活动的主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); 
    } 
}); 
+0

@spatulamnia谢谢你的回复,但如果我只是想禁用一些元素,我不会让这个问题值得赏赐。这将是非常简单的事情。我不想暂停UI线程,但我希望实现相同的最终结果,就好像UI主线程已暂停。例如:UI线程正在处理以下步骤:A,B,C现在用户执行一些操作在UI中,当线程在步骤B时,此时我不希望线程转到步骤C并等待用户操作。 –

+0

啊。处理这种情况的常用方法是在处理中引入* paused *标志。设置此项时,执行处理的线程将循环并继续检查影响暂停状态的该标志。取消暂停将会将此标志设置回原始值,以允许恢复正常执行。 – spatulamania

+0

这不会立即暂停该线程,但允许该线程达到'pausable'状态,在该状态下它可以收听'unpause'通知。 – spatulamania