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】:您可以使用Handler
类postDelayed
方法不阻塞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 - 延迟线程也会冻结其他活动的主要内容,如果未能解决你的问题,请参考以下文章