[英]How to pause the activity?
我想在用戶執行某些操作(例如長按)時暫停“事件線程”/活動,並在用戶執行其他操作(簡單點擊)時取消暫停。 問題是,在我長按一下后,事件線程進入等待隊列。 因此,當進行簡單的點擊時,不會被攔截。 我該如何實現這一目標? 請注意,我不想通過顯示一些進度對話框等暫停活動,我想在前台保留我的活動並暫停。這是我嘗試過的:/
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();}
}
});
正如其他人所說, 暫停活動的主要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);
}
});
這可能是一個愚蠢的解決方案,這是嵌入式系統的發展方向,盡管這肯定會降低性能。
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線程,並希望通過用戶操作取消阻止它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.