0

動的期間を遅らせるために postDelayed を使用しました。そして、それが正しく機能しないことがわかりました。これが私のソースコードです。

public Runnable service = new Runnable() {
        public void run() {     
            endTimeHere = System.currentTimeMillis();
            Log.d("Time",(endTimeHere-startTimeHere)/1000);
            switch (step)
            {
                case 0: 
                    delay = 0;
                    step = 1;
                    break;
                case 1:
                    delay = 600;        //delay 10 min = 600 sec
                    step = 2;
                    break;

                case 2:     
                    delay = 1200;   //delay 20 min = 1200 sec
                    step = 3;
                    break;
                case 3:     
                    delay = 1800;   //delay 30 min = 1800 secs
                    step = 0;
                    break;
                default:
                    break;
            }
            startTimeHere = System.currentTimeMillis();
            handler.postDelayed(service, delay*1000);   
        }
    };

そして、BroadcastLintener でハンドラーを開始および停止します。

public Handler handler = new  Handler();    
private BroadcastReceiver screenReceiver = new BroadcastReceiver()
    {
        public void onReceive(Context context, Intent intent)
        {
            String action = intent.getAction();
            if(Intent.ACTION_SCREEN_ON.equals(action))
            {
                handler.removeCallbacks(service);
            }
            else if(Intent.ACTION_SCREEN_OFF.equals(action))
            {
                handler.post(service);
            }
        }
    }

戻り値がtrueなので、postDelayedがキューに追加されていると確信しています。しかし、記録した時間が設定した遅延値と一致しません。たとえば、遅延 = 600 秒、記録時間 = 958 秒に設定します。

なぜこれが起こったのか誰か知っていますか?

4

1 に答える 1

0

ハンドラーは、必要なときに正確に発砲するのが完璧ではありません。他のスレッド (UI スレッドなど) が優先される場合があります。さらに、Android にはインテントを処理するためのオーバーヘッドがあります。つまり、OS からのスレッド監視の遅延により、ハンドラーは 650 ミリ秒で起動する可能性がありますが、その後、インテントを処理し、レシーバーをインスタンス化し、インテントを処理する必要があります。

遅延データを含むインテントを送信してから、サービスにキューをセットアップさせ、予想される遅延に基づいて頻繁にポーリングする方がよい場合があります。たとえば、将来 500 ミリ秒にスケジュールされたイベントは、50 ミリ秒ごとにポーリングして、遅延時間が経過したかどうかを確認する必要があります。10,000 ミリ秒先のイベントを 5,000 ミリ秒または 9,000 ミリ秒でポーリングし、時間が近づくにつれてポーリング頻度を増やすことができます。

于 2014-02-05T20:23:17.277 に答える