2013-03-15 22 views
1

我正在製作演示文稿應用程序,該應用程序顯示不同的圖像。在那裏我想讓演示文稿在短時間內滑過我的圖像列表,視頻和pdf文件。Android,如何測量已過去的時間量

我通過意圖開始我的不同意見,startActivityForResult(intent, RESULT_OK);

啓動視頻和關閉視頻是不是一個問題。我用onPreparedListenersetOnCompletionListener,一切都像魅力一樣。

但是,這是完全不同的圖片。

我在ImageView創造了一個新的Thread並沒有把該線程sleep(),在那之後我打電話給setresult()方法和finish()。但沒有等待,圖片根本沒有顯示,演示文稿卡在那裏,沒有設置結果和完成活動。

於是我開始尋找在安卓的時候一些解釋,發現這樣的解釋:

Explanation

我通讀一遍,並試圖得到什麼解釋有一個很好的把握。但是我越想到這個問題,我越是感到不安全,這是實現我的預期目的的等待行爲的最佳方式。

所以不是一些代碼,我更感興趣,你會建議我使用什麼,爲什麼用一個,如果可能,詳細的解釋。

  1. elapsedRealtime()
  2. uptimeMillis()
  3. System.currentTimeMillis()
+0

你想達到什麼激動人心的?您想要在經過指定的時間後在ImageView中更改圖像? – 2013-03-15 15:00:51

+0

,如果下一個List元素是我希望ImageView等待然後顯示的另一個圖像,否則關閉並返回RESULT_OK到我的演示文稿並讓演示文稿,繼續或完成,具體取決於是否存在更多圖像,視頻等留在我的列表中 – aldr 2013-03-15 15:04:48

+0

你想要的是[Handler](http://developer.android.com/reference/android/os/Handler.html)。 – m0skit0 2013-03-15 15:07:12

回答

1
實現這一

簡單的方法是CountDownTimer

private final class CountDownTimerImpl extends CountDownTimer { 
    //5 sec. 
    private static final long TIME_INTERVAL = 5000; 
    private final ImageView imageView; 
    private final List<Drawable> images; 

    public CountDownTimerImpl(ImageView imageView, List<Drawable> images) { 
     super(TIME_INTERVAL, TIME_INTERVAL); 
     this.imageView = imageView; 
     this.images = images; 

     //set first image from images array to imageView 
     imageView.setImageDrawable(images.get(0)); 
    }  

    //this method is executed after TIME_INTERVAL (5 sec.) 
    public void onFinish() { 
     //remove drawable from imageView 
     imageView.setImageDrawable(null); 
     //remove this drawable from array 
     images.remove(0); 
     //if array is not empty start another count down 
     if (!images.isEmpty()) { 
      new CountDownTimerImpl(imageView, images).start(); 
     } 
    } 

    public void onTick(long millisUntilFinished) { 
     //nothing to do here 
    } 
} 

你應該啓動該CountDownTimer:

new CountDownTimerImpl(imageView, images).start(); 

其中images是當然還有一個可展示圖像的可繪製陣列。

我沒有時間測試這個解決方案,但它應該可以工作 - 如果不是,請留下評論,稍後再更新。

+0

我很喜歡這個解決方案!試圖執行預期的行爲,使用處理程序和意圖,但它沒有像預期的那樣工作。我經常得到NoM​​emoryErrors,或者BitmapFactory崩潰等等......謝謝。 – aldr 2013-03-17 00:17:32

0

您可以使用TimerTask的

int counter=0; 
final Handler handler = new Handler(); 
Timer ourtimer = new Timer(); 
TimerTask timerTask = new TimerTask() { 
     public void run() { 
       handler.post(new Runnable() { 
         public void run() { 
counter++; 
       //you can do stuffs here say like if (counter==15) { do something} 


         } 
      }); 
     }}; 


ourtimer.schedule(timerTask, 0, 1000); 
4

從Android電子文檔:

•System.currentTimeMillis的()是表達毫秒,因爲時代標準的 「牆」 時鐘(時間和日期) 。掛鐘可以由用戶或電話網絡設置(請參閱setCurrentTimeMillis(long)),因此時間可能會跳躍或轉發不可預知。只有在與真實世界日期和時間的對應非常重要時才能使用此時鐘,例如在日曆或鬧鐘應用程序中。間隔或經過時間測量應使用不同的時鐘。如果您使用的是System.currentTimeMillis(),請考慮監聽ACTION_TIME_TICK,ACTION_TIME_CHANGED和ACTION_TIMEZONE_CHANGED Intent廣播以瞭解時間何時更改。

•uptimeMillis()以系統引導後的毫秒計算。當系統進入深度睡眠(CPU關閉,顯示黑暗,設備等待外部輸入)時,該時鐘停止,但不受時鐘縮放,空閒或其他節能機制的影響。這是大多數間隔計時的基礎,例如Thread.sleep(millls),Object.wait(millis)和System.nanoTime()。這個時鐘保證是單調的,並且當間隔不跨越設備睡眠時適用於間隔定時。接受時間戳值的大多數方法當前都需要uptimeMillis()時鐘。

•elapsedRealtime()和elapsedRealtimeNanos()返回自系統啓動以來的時間,幷包含深度睡眠。這個時鐘保證是單調的,即使在CPU處於省電模式時也會繼續保持時鐘狀態,所以是通用間隔時序的推薦基礎。

如果您要測量的時間間隔相對較短,您可以使用幾乎任何可以給您正確時間的方法。我更喜歡currentTimeMillis()。如果時間間隔很長,推薦的方法是使用elapsedRealtime()。另外,如果你只想做一些延遲,只需使用:http://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable,long)。這很簡單,效果很好。

0

您可以用不同的方式做到這一點寫一個回調模塊

創建活動稱之爲BaseActivity,讓你活動,以延長它 現在宣佈一個方法調用void callback(){}保持身體空

現在的onCreate創建一個定時器如上並調用回調函數的代碼看起來像

onCreate(){ 
final Handler handler = new Handler(); 
Timer callTimer = new Timer(); 
TimerTask timerTask = new TimerTask() { 
     public void run() { 
       handler.post(new Runnable() { 
         public void run() { 
      callback(); 


         } 
      }); 
     }}; 


callTimer.schedule(timerTask, 0, 1000); 
} 

現在在你的活動覆蓋回調方法,這將在之後被稱爲您在計時器指定的時間,

防爆

Class a extends BaseActivity(){ 

@Override 
onCreate(){ 
// playVideo 
} 

@Override 

void onCallBack(){ 
//navigate to another activity 
} 

}