16

タイマーを使用してインターバル アプリを作成する計画があります。それは最も基本的なものである必要があるので、基本を理解したら、さらに追加する必要があります。私が達成したいのは、間隔が続く分数を選択することですが、この間隔が何回続くべきかです。1分間続く8回のインターバルのように。問題は、どのタイマーを使用するのが最適かということです。私は Android のカウントダウン タイマーを試してみましたが、うまくいくようです。しかし、他に良いものはありますか?

4

1 に答える 1

52

私は常にを使用することをお勧めしHandlerます。

組み込みのクラスよりも少し手間がかかりますが、はるかに効率的であり、より詳細に制御できることがわかりました。

Looperハンドラーは、特定の/Threadデフォルトでは作成されたスレッドでのコード実行を処理するクラスです。それ以外の場合は、ハンドラーに-のようLooperHandlerコンストラクターに渡すことで、ハンドラーがコードを実行する場所を指定できます。new Handler(Looper.getMainLooper());

ルーパーをお勧めする理由は、TimerTaskメソッドの抽象化がわずかに低いため、制御の柔軟性が高いためです。

一般に、これらはスレッド間でコードを実行するのに非常に役立ちます。たとえば、スレッド間でデータをパイプするのに役立ちます。

2つの主な用途は次のとおりです。

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    final Handler h = new Handler();
    h.postDelayed(new Runnable()
    {
        private long time = 0;

        @Override
        public void run()
        {
            // do stuff then
            // can call h again after work!
            time += 1000;
            Log.d("TimerExample", "Going for... " + time);
            h.postDelayed(this, 1000);
        }
    }, 1000); // 1 second delay (takes millis)
}

簡単な使い方!

または、メッセージを使用して、オブジェクトの作成を減らすことができます。UIの高速更新などを検討している場合、これによりガベージコレクターへの負担が軽減されます。

class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        MyTimers timer = new MyTimers();
        timer.sendEmptyMessage(MyTimers.TIMER_1);
        timer.sendEmptyMessage(MyTimers.TIMER_2);

    }


    public static class MyTimers extends Handler
    {

        public static final int TIMER_1 = 0;
        public static final int TIMER_2 = 1;

        @Override
        public void handleMessage(Message msg)
        {
            switch (msg.what)
            {
                case TIMER_1:
                    // Do something etc.
                    Log.d("TimerExample", "Timer 1");
                    sendEmptyMessageDelayed(TIMER_1, 1000);
                    break;
                case TIMER_2:
                    // Do another time update etc..
                    Log.d("TimerExample", "Timer 2");
                    sendEmptyMessageDelayed(TIMER_2, 1000);
                    break;
                default:
                    removeMessages(TIMER_1);
                    removeMessages(TIMER_2);
                    break;
            }
        }
    }
}

明らかに、これは完全な実装ではありませんが、有利なスタートを切ることができます

于 2012-10-27T13:33:20.557 に答える