android - 延迟线程也会冻结其他活动

Posted

技术标签:

【中文标题】android - 延迟线程也会冻结其他活动【英文标题】:android - Delay thread freezes other activities as well 【发布时间】: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 操作 【参考方案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 中。

以上是关于android - 延迟线程也会冻结其他活动的主要内容,如果未能解决你的问题,请参考以下文章

如何检测android中的活动冻结和滞后原因?

如何在不冻结线程的情况下延迟答案? [复制]

即使我在单独的线程中运行,QT GUI 也会冻结

当另一个线程正在工作时,活动在启动时冻结

当一个线程遇到异常时是不是可以冻结所有线程

Android 应用程序在完成活动时冻结,runOnUiThread() 停止工作