簡體   English   中英

如何暫停活動?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM