2014-03-01 39 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; 
    } 
}