1

時間指定されたスペースで 3 つのアクションを実行する必要があるコードの特定の部分で、現在、このメソッドを使用しています。

Handler mHander = new Handler();


public void startChainActions(){

// do first action
      mHandler.postDelayed(new Runnable() {
          @Override
          public void run() {

          //do action 2

                    mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {

                    //do action 3
                    }
                  }
                }, 1500);

              }
             }
            }, 5000);
           }


public void cleanResources(){

    mHandler.removeCallbacksAndMessages(null);
    mHandler==null
}

この方法を使用すると、logcat に次のメッセージが表示されることがよくあります。

W/art﹕ Suspending all threads took: 12.272ms

これにより、パフォーマンスが低下していると思われます。お互いの後にアクションの時間を計るより良い方法はありますか?

4

2 に答える 2

0

まず、ハンドラの場合、ハンドラが作成された同じスレッドで Runnable を実行することを理解する必要があります。これは、メイン スレッドで実行する場合、ハードウェア パワーを任意のユーザー <-> UI インタラクションと共有することを意味し、実行開始の正確な時間に関する保証はありません。

body からの質問への回答 - いいえ、2 つの呼び出しが原因でパフォーマンスが低下することはありませんがpostDelayed、あなたの行動が原因である可能性があります。したがって、ログメッセージは別のものに関連付けられています。

更新: タイトルからの質問への回答: 遅延アクションを実行したい場合は、そうではありません - 特にメイン/UI スレッドで実行する場合は、Android で実行するのが通常の方法です。

于 2015-03-22T08:09:42.077 に答える
0

SingleThreadExecutor以下のような使い方はできませんか?

ExecutorService animationQueue = Executors.newSingleThreadExecutor();

animationQueue.submit( new Runnable() {
    public void run() {
        // action 1
        Thread.sleep(5000);
    }
});

animationQueue.submit( new Runnable() {
    public void run() {
        // action 2
        Thread.sleep(1500);
    }
});

animationQueue.submit( new Runnable() {
    public void run() {
        // action 3
    }
});
于 2015-03-22T09:17:36.433 に答える