【问题标题】:android - Delay thread freezes other activities as wellandroid - 延迟线程也会冻结其他活动
【发布时间】:2013-12-24 22:41:49
【问题描述】:

我有一个名为 actions_table 的表。其中有必须按特定顺序执行的操作,它们由单独的服务实施。一切正常,除了延迟动作。当动作表中有延迟时,只要给定的延迟,应用就会冻结,最奇怪的是,其他服务会在延迟之后执行,即使它们是在 delay_thread 启动之前启动的!!

我已经用一个thead和一个while循环来实现延迟,检查系统时间是否超过了start_time + delay_time。同样的结果。

如何在不延迟延迟之前启动的服务的情况下实现此延迟? (而且不冻结 UI 也很好)

MainActivity{
   onCreate{
       .
       .
       .
       for(i=0;i<actions_table.length;i++){

           if(condition1)
               startService1

           else if(delay_condition2)
                delay_thread.start();

           else if(condition3)
                startService3
       }
       .
       .
       .
    }
}

我终于想出了一些可行的方法。分享我为他人所做的事情。

delay=0;
for(i=0;i<actions_table.length;i++){
    if(current_action is delay)
        delay=number_of_seconds 
    final Handler = new Handler();
    handler.postDelayed(new Runnable(){
       @Override
       public void run() {

           if(condition1)
               startService1
                .
                .
                .
            else if(conditionX)
                startServiceX
       }
       },delay*1000);
}

这样,延迟操作之后的所有操作都会在所需的秒数后一起执行。 (action1, action2----delay---action3, action4.....actionX)

【问题讨论】:

  • 你应该使用处理程序而不是线程,使用处理程序你也可以执行 UI 操作。它只是一种线程。我们应该使用它来执行 UI 操作

标签: android multithreading delay


【解决方案1】:

试试这个代码示例。有用。

final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    // Do something after 10s = 10000ms


                }
            }, 10000);

【讨论】:

    【解决方案2】:

    您可以使用HandlerpostDelayed 方法不阻塞UI 并延迟Runnable 运行。

    public boolean condition12ok = true;
    public boolean condition34ok = false;
    
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (condition12ok) {
                action1();
                action2();
                condition12ok = false;
                condition34ok = true
                handler.postDelayed(this, 10);
            } else if (condition34ok) {
                action3();
                action4();
            }
        }
    }, 10);
    

    因此,如果没有条件满足,则不会发生任何事情。如果 condition12ok 为真,它会运行动作 1 和 2,然后再次发布相同的 Runnable,然后条件 3 和 4 应该没问题并且循环停止。

    【讨论】:

    • 您能进一步解释一下吗?我如何使用你提到的工具?
    • 我更新了我的答案来给出这个想法,你如何使用 Handler 和 Runnable 进行轮询来做事,如果你不需要这么快的迭代,你可以在那里调整延迟时间。
    • 添加 handler.postDelayed(this, delay);在处理程序代码内部从其自身内部调用处理程序,从而导致对处理程序代码的永久调用。我不想要。删除这个命令我留下了最后定义的处理程序延迟。 "},10);"在你的代码中。因此,如果我在 for 循环中定义处理程序,则所有操作之间的延迟相同。这导致了 this[action1...delay...action2...delay...] 而我想要实现的是这个 [action1,action,2....delay...action3,action4] (除非我误用了您的代码,在这种情况下请随时纠正我)
    • 您可以在某些条件正常的情况下同时运行action1和action2,然后再次发布相同的runnable,运行action3和action4并且不要发布runnable,因此没有无限循环。
    • 如果对您的情况有帮助,我更新了我的答案,如果您有多种情况,则不应使用布尔值,而是使用枚举或整数定义状态机,以便在检测您需要运行的内容时处理在 Runnable 中。
    猜你喜欢
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2014-06-03
    • 2012-10-25
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多