在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/