Androidがタイマーを実現するいくつかの方法

8036 ワード

前言
ここ数日Android公式の開発文書を見ていますが、そこには考えるべき開発アドバイスがたくさんありますので、時間のある方は見てみてください(公式は英語の文書なので、読めない場合はブラウザプラグイン翻訳で比較してみても便利です).
その中の1つの授業では、AlarmManagerについて言及しています.このクラスは、アラームのマネージャであることを知っていただけで、アラームや目覚まし時計などのソフトウェアよりも使用する必要があります.公式の例はタイマーを実現するために使われていて、突然これは不思議なことだと思って、いくつかの資料を集めて、私が知っているタイマーを実現するいくつかの方法を書いて、自分に記憶を深めて、みんなに分かち合います.
本文
私が使っているいくつかの実装タイマのクラス:Handler,Timer,Thread,AlarmManager.
AlarmManager
AlarmManagerはシステム開放の目覚まし時計機能で、使い方は普通のmanagerと変わらない.
AlarmManager am = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);  
// Schedule the alarm!  
Intent intent = new Intent(XXXXX);
PendingIntent sender = PendingIntent.getBroadcast(mcontext,requestCode, intent, 0);  
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,  
                         firstTime, 30*1000, sender); 

タイマーの基本的な使い方は、まずmanagerを取得し、目覚まし時計のflag、サイクル時間、指定した時間に発せられるpendingIntentを定義します.
一般的に発行されるpendingIntentはすべてブロードキャストで、私たちはブロードキャスト受信機をカスタマイズして、このブロードキャストを受信することで、自分の機能論理を処理することができます.
ここではandroidで定義された独立したプロセスで構成することに注意してください.
<receiver android:name="com.xxxx.Receiver" android:process=":remote" />

長所のまとめ
1,Alarmタイミングはプログラム自身のメンテナンスを必要とせず、またシステムのメンテナンスを必要とし、プログラムがエラーの問題をよりよく回避し、システム資源、cpu占有率を占有する.
2,プログラムが終了しても,プログラム自体に何の悩みもなく,システムは時間になると自動的に対応するコンポーネントを呼び出して定義された論理を実行する.
3、タイミングの多様性、1回のタイミング、サイクルタイミング(xx年x月x日に実行、月曜日から金曜日に実行、毎日何時何分に実行)を含む...
適用シーン
個人的には独立した機能ロジックに適していると思います.例えば、appがサーバから最新のデータをタイミングよくキャプチャする必要がある場合、独立したサービスを使用すると本体の機能から分離され、メンテナンスが容易になります.肝心なのは消費電力が低く、エラーが発生しにくいことです.
Handler
Handlerは、サブスレッド解析データなどのUIスレッドをサブスレッドで操作し、解析が終了した後、UIにインタフェースのリフレッシュを通知するのに役立ちます.彼自身もタイマーを実現することができます.
private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case 0:
                //      msg.what 0   ,              
                handler.removeMessages(0);
                // app       
                ...
                //     msg,    
                handler.sendEmptyMessageDelayed(0, 1000);
                break;

            case 1:
                //     ,     
                handler.removeMessages(0);
                break;

            default:
                break;
            }
        };
    };

タイマーを起動する時だけsendEmptyMessage(0)では、タイマーが起動します.ループと停止を続ける方法は、コメントに書かれています.
長所のまとめ
ループのたびにメインスレッドで動作し、サブスレッドとメインスレッドの間の挿入インタラクションを回避し、個人的にはtimerよりも制御がよく、機能実現も簡単だと思います.
適用シーン
個人的には連続更新UIが適用されると思いますが、複雑で時間のかかる処理をしない場合、例えばプレーヤーでは、現在の再生進捗時間の表示を更新する必要があります.文字表示を更新しただけで、handlerを使うのはいい選択です.
Timer
TimerはAndroidがタイマーを直接起動するクラスであり、タイマーの機能を実現できるツールクラスにも最初に触れました.
彼の使い方は普通の人が知っています.
//       
Timer timer = new Timer();
timer.schedule(new TimerTask() {

    @Override
    public void run() {
        Log.e("lzp", "timer excute");
    }
}, delay, period);

//      
private void stopTimer(){
    if(timer != null){
        timer.cancle();
        //      null,          
        timer = null;
    }
}

delay:タイマの初期化に成功してから起動する遅延時間.period:タイマの間隔.
長所のまとめ
Timerの使用は簡単で、TimerTaskはサブスレッドで、比較的複雑で時間のかかる機能論理を処理するのに便利で、handlerと組み合わせてよく使用されています.
適用シーン
handler自身が実装したタイマと比較して、Timerはいくつかの複雑な処理を行うことができ、例えば、大量のオブジェクトを持つlistをソートする必要があり、TimerTaskでサブスレッドをブロックすることなくhandlerと組み合わせて使用され、複雑で時間のかかる操作を処理した後、handlerを介してUIインタフェースを更新することが多い.
**特に突っ込み:一部の携帯電話では、TimerTaskでUIスレッドを直接更新してもエラーは報告されず、正常に動作しますが、UIの更新は必ずメインスレッドで実行しなければなりません.そうしないと、エラーをチェックするときにわかります.しかもこれは特に消費電力、特に消費電力、特に消費電力、重要なことを3回言って、必ず使用しない時に閉じて、慎重に使います.**
Thread
Threadインプリメンテーションタイマは、中でwhileループを作成し、handlerでUIを更新することができます.個人的にはThreadはTimerと変わらないと思いますが、違う顔をしています.
private MyThread thread;

    private class MyThread extends Thread {

        public boolean stop;

        public void run() {
            while (!stop) {
                //     

                //              
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
    };

    /**
     *     
     * */
    private void start() {
        if (thread == null) {
            thread = new MyThread();
            thread.start();
        }
    }

    /**
     *     
     * */
    private void stop() {
        if (thread != null) {
            thread.stop = true;
            thread = null;
        }
    }

長所のまとめ
Timerとの差はあまりないと思いますが、特別なメリットはありません.
適用シーン
Timerとの差は少ないでしょうが、マルチスレッドは考えが行き届かないとよく問題が発生し、同じ機能のスレッドが複数同時に存在することが多く、android自体はサブスレッドの使用数に制限があり、1つのappが同時に複数のスレッドを走るのは恐ろしいことなので、Timerと同様に、使用する際は慎重に考えなければなりません.
の最後の部分
以上は私個人が使ったタイマーのいくつかの実現方法ですが、簡単な紹介だけで、もっと詳しい使い方はネット上に多くの関連資料があります.もし間違いがあれば、コメントを歓迎して指摘して、この文章を読んであなたに役立つことを望んでいます.