Java(Android)线程 - 每隔一段时间重复一次任务,并访问值

时间:2010-02-13 18:09:52

标签: java multithreading

我在Android上编程,但我想这是一个普遍的Java 101问题......

我希望myMethod()在不阻塞UI的情况下每隔X毫秒运行一次 - 应该可以启动和停止此线程。 X毫秒的值将在运行时发生变化。 myMethod()需要对由UI操纵的数组进行读访问。

我该怎么做?随着间隔的变化,我无法使用schedule();那么这是睡眠的有效案例(int X)吗?如果我在新类中启动一个新线程(runnable或extend Thread),我该如何读取UI类的数组? (像parent.getarray()这样的东西存在吗?)。解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

ScheduledThreadPoolExecutor类为您提供日程安排功能。 It has some advantages over java.util.Timer

我不知道Android,但它似乎也是ScheduledThreadPoolExecutor is available on Android

使用STPE很简单:您创建RunnableCallable实例,并通过schedule方法将其与调度信息一起传递给执行者(调用频率的频率,是什么开始延迟)。

要从UI线程访问数组,您需要使用某种同步。看看AtomicReferenceArray,AtomicLongArray或AtomicIntegerArray,如果他们可以帮助你(他们给你原子访问数组元素而没有任何其他同步,尽管你最好让你的数组变量最终)。其他选项是将对数组的所有读取和写入放入synchronized块。另一种可能性是使用CopyOnWriteArrayList。如果您还需要从后台任务更新UI,则需要将更新代码包装到另一个Runnable中并将其传递给UI线程。最佳选择实际上取决于你究竟在做什么。

答案 1 :(得分:2)

你可以创建一个java.util.Timer对象来保持TimerTask对象。这样你就可以每次只安排Timer,让所需的X作用于TimerTask

http://developer.android.com/reference/java/util/Timer.html http://developer.android.com/reference/java/util/TimerTask.html