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