如何在 Android 中的非 UI 线程上执行延迟

Den*_*s K 5 multithreading android handler

因此,关于如何在 Android 上进行延迟有多个类似的问题/答案。然而,他们主要专注于在 UI 线程上执行此操作。如果我需要延迟服务中的工作线程(并且我不想让线程进入睡眠状态)怎么办?Handler.postDelayed() 不起作用,因为存在“无法在线程内创建处理程序没有调用 Looper.prepare()”异常。CountDownTimer 出于同样的原因不起作用。而且我没有任何意见可以调用 runOnUiThread()。那么是在我拥有的每个线程上都有一个循环器的唯一解决方案还是有另一种方法可以做到这一点?

更新:这很愚蠢,但我在我自己的旧代码中找到了对我有用的答案:)。基本上,如果您想从非 UI 线程延迟启动 Runnable,您需要做的就是让主循环程序处理这个问题。

    Handler handler = new Handler(Looper.getMainLooper());
    Runnable r = new Runnable() {

        @Override
        public void run() {
        // Do stuff to be run after a delay
        // CAUTION: this won't be run on the same thread
        }
    };
    handler.postDelayed(r, DELAY_TIME); 
Run Code Online (Sandbox Code Playgroud)

缺点可能是该 Runnable 中的代码不会与原始代码在同一线程上运行。这就是为什么我不把这种方法作为被接受的答案(我承认,最初的问题听起来像是我希望在同一个非 UI 线程上发生一个定时事件。为此我还没有答案除了 Emmanuel 的那个,我必须在我的线程上附加一个 Looper)。然而,出于我的目的,这有效,因为我只需要在超时时启动服务。

Emm*_*uel 3

就像您从 中看到的那样,Exceptions为了Handlers在 a 中使用Thread,您需要将 附加ThreadLooper。为了提供更多背景信息,当您致电时,您正在向的 ;postDelay()发布消息。负责管理此事。所以如果你想去ThreadMessageQueueLooperQueueHandler路线,您将需要Thread使用Looper.

如果您想延迟Thread而不执行sleep()(我不知道为什么您不能使用sleep()),您可以让 awhile运行到从现在开始的某个时间过去。(这听起来是一个可怕的想法)。