2014-03-01 86 views
0

我試圖在延遲2秒後啓動一項活動。代碼 -暫停/恢復處理程序發佈延遲

runnable = new Runnable() { 
     @Override 
     public void run() { 
      final Intent i = new Intent(PreviewCoordinatesActivity.this, 
        StylePreviewActivity.class); 
      i.putExtra(AppConstants.IMAGEPATH, sImagePath); 
      moveNextToAndFinish(i); 
     } 
    }; 
    handler.postDelayed(runnable, DELAY); 

我想在活動暫停時暫停操作,並在活動回到前臺時恢復操作。

目前我只刪除回調當活動被暫停 -

@Override 
protected void onPause() { 
    super.onPause(); 
    if (handler != null) { 
     if (runnable != null) 
      handler.removeCallbacks(runnable); 
    } 

} 
+6

沒有停頓。您需要保存值停止處理程序。同樣在恢復運行處理器的值保存 – Raghunandan

+0

是的,你必須將值保存到任何靜態變量,通過它你可以啓動你的線程。 – Nitin

+0

我覺得2秒鐘的時間很少。按住home鍵2秒鐘就完成了。想想如果你在1秒內暫停並從剩下的1秒恢復。它看起來不太好。 –

回答

0

這是我使用的實現:

private static final long PAUSED_TIME_UNSET = 0L; 

private Handler delayHandler; 
private long pausedTime; 
private List<Message> pendingMessages; 
private Map<Message, Long> messageTimeMap; 

//this should not be called while paused 
protected Runnable runAfterDelay(Runnable toRun, long delayMillis) { 
    if (delayHandler == null) { 
     delayHandler = new Handler(new Handler.Callback() { 
      @Override 
      public boolean handleMessage(Message msg) { 
       pendingMessages.remove(msg); 
       if (msg.obj instanceof Runnable) { 
        ((Runnable) msg.obj).run(); 
       } 
       return true; 
      } 
     }); 
    } 
    Message m = Message.obtain(); 
    m.obj = toRun; 
    pendingMessages.add(m); 
    delayHandler.sendMessageDelayed(m, delayMillis); 
    return toRun; 
} 

protected void cancelDelayedRunnable(Runnable runnable) { 
    for (Iterator<Message> iter = pendingMessages.iterator(); iter.hasNext();) { 
     Message msg = iter.next(); 
     if (msg.obj == runnable) { 
      iter.remove(); 
      break; //assume all runnables are unique 
     } 
    } 
    delayHandler.removeCallbacksAndMessages(runnable); 
} 

protected void cancelAllDelayedRunnables() { 
    if (delayHandler != null) { 
     delayHandler.removeCallbacksAndMessages(null); 
     delayHandler = null; 
    } 
    pendingMessages.clear(); 
} 

public void pause() { 
    if (delayHandler != null && pausedTime == PAUSED_TIME_UNSET) { 
     pausedTime = SystemClock.uptimeMillis(); 

     //need to copy the Messages because their data will get cleared in removeCallbacksAndMessages 
     List<Message> copiedMessages = new ArrayList<Message>(); 
     for (Message msg : pendingMessages) { 
      Message copy = Message.obtain(); 
      copy.obj = msg.obj; 
      messageTimeMap.put(copy, msg.getWhen()); //remember the time since unable to set directly on Message 
      copiedMessages.add(copy); 
     } 
     //remove all messages from the handler 
     delayHandler.removeCallbacksAndMessages(null); 
     pendingMessages.clear(); 

     pendingMessages.addAll(copiedMessages); 
    } 
} 

public void resume() { 
    if (delayHandler != null && pausedTime != PAUSED_TIME_UNSET) { 
     for (Message msg : pendingMessages) { 
      long msgWhen = messageTimeMap.get(msg); 
      long timeLeftForMessage = msgWhen - pausedTime; 
      delayHandler.sendMessageDelayed(msg, timeLeftForMessage); 
     } 
     messageTimeMap.clear(); 
     pausedTime = PAUSED_TIME_UNSET; 
    } 
}