gpt4 book ai didi

java - 在Android中,什么线程可运行传递给Executors.newSingleThreadScheduledExecutor运行?

转载 作者:行者123 更新时间:2023-12-01 11:57:46 39 4
gpt4 key购买 nike

在Android中,什么线程可运行传递给ScheduledExecutorService#schedule(Runnable command, long delay, TimeUnit unit)Executors#newSingleThreadScheduledExecutor() 返回运行在?

至于我的努力,我运行以下代码:

        final ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
ses.schedule(new Runnable() {
@Override
public void run() {
inflate.setBackgroundDrawable(background);
}
}, 200, TimeUnit.MILLISECONDS);
ses.shutdown();

在 Moto G 2013、Android 5.0.2 上,setBackgroundDrawable 操作工作正常,意味着它在主 (UI) 线程上运行。

具体来说,这对于所有 Android 版本和设备都是如此吗?链接的 javadoc 页面对此没有任何说明。我想避免像服务可以生成一个新的单线程来运行操作之类的陷阱。

最佳答案

调用Executors.newSingleThreadScheduledExecutor()时,将创建一个新的Thread(属于同一ThreadGroup)。隐式使用的 DefaultThreadFactory 看起来像这样

static class DefaultThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;

DefaultThreadFactory() {
SecurityManager s = System.getSecurityManager();
group = (s != null)? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
}

public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}

如果你想重用 UI-Thread,你应该编写自己的 ThreadFactory 返回 UI-Thread 并调用 Executors.newSingleThreadScheduledExecutor(yourNewlyCreatedThreadFactory)

关于java - 在Android中,什么线程可运行传递给Executors.newSingleThreadScheduledExecutor运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28298654/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com