首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostDelayed不能正常工作

PostDelayed不能正常工作
EN

Stack Overflow用户
提问于 2014-02-06 04:13:52
回答 1查看 1.1K关注 0票数 0

我使用postDelayed来延迟动态持续时间。我发现它不能正常工作。这是我的源代码。

代码语言:javascript
复制
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中启动和停止处理程序。

代码语言:javascript
复制
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);
            }
        }
    }

我确信postDelayed会被添加到队列中,因为返回值为真。但是,我记录的时长与我设置的延迟值不匹配。例如,我设置了延迟= 600秒,记录的持续时间= 958秒。

有人知道为什么会这样吗?

EN

回答 1

Stack Overflow用户

发布于 2014-02-06 04:23:17

处理程序在应该触发的时候并不是完美的。其他线程(如UI线程)可能会优先使用。此外,Android有处理意图的开销。换言之,由于来自OS的线程监控中的延迟,处理程序可能在650ms处触发,但是随后需要处理意图、实例化接收器、处理意图等。

您最好发送带有延迟数据的意图,然后让服务设置一个队列,并根据预期的延迟频繁地轮询它。例如,安排在未来500ms的事件可能应该每50ms轮询一次,以查看延迟时间是否已过期。而将来10000ms的事件可以5000ms或9000ms轮询,然后随着时间的临近增加轮询频率。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21587498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档