1

さまざまな画像を表示するプレゼンテーション アプリに取り組んでいます。そこで、短い時間の後に、プレゼンテーションを画像、ビデオ、および PDF ファイルのリストにスライドさせたいと考えました。

私は意図を通してさまざまな見方を始めます。startActivityForResult(intent, RESULT_OK);

ビデオの開始とビデオの終了は問題ではありませんでした。私は and を使用onPreparedListenersetOnCompletionListener、すべてが魅力のように機能しました。

しかし、写真では、これは完全に異なっていました。

Thread私は自分で新しいを作成し、ImageViewそのスレッドを に置きました。その後、メソッドとsleep()を呼び出しました。しかし、待つ代わりに、結果を設定してアクティビティを終了することなく、画像がまったく表示されず、プレゼンテーションがそこでスタックしました。setresult()finish()

そこで、アンドロイドで時間の説明を探し始めたところ、次の説明が見つかりました。

説明

私はそれを読み、そこで説明されていることをよく理解しようとしました。しかし、考えれば考えるほど不安になりました。これは、意図した目的のために待機動作を実装するための最良の方法です。

したがって、いくつかのコードの代わりに、私はあなたが私に使用するようにアドバイスするものと、可能であれば詳細な説明を添えて、もっと興味があります.

  1. elapsedRealtime()?
  2. uptimeMillis()?
  3. System.currentTimeMillis()?
4

4 に答える 4

5

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() クロックを想定しています。

•lapsedRealtime() およびlapsedRealtimeNanos() は、システムが起動してからの時間を返し、ディープ スリープを含みます。このクロックは単調であることが保証されており、CPU が省電力モードの場合でも刻々と進みます。そのため、汎用のインターバル タイミングの基準として推奨されます。

測定しようとしている時間間隔が比較的短い場合は、正確な時間を与えるほとんどすべての方法を使用できます。私は currentTimeMillis() を好みます。時間間隔が非常に長い場合、推奨される方法は、epusedRealtime() を使用することです。

また、遅延で何かをしたい場合は、単にhttp://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable , long) を使用してください。シンプルで、うまく機能します。

于 2013-03-15T15:08:42.900 に答える
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プレゼンテーション画像のドローアブル配列です。

このソリューションをテストする時間はありませんが、うまくいくはずです。うまくいかない場合は、コメントを残してください。後で更新します。

于 2013-03-15T17:26:27.187 に答える
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);
于 2013-03-15T15:07:43.223 に答える
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
}

}
于 2013-03-15T15:51:58.140 に答える