Java Android调度快速任务
我对事件安排有问题。我需要改变文本颜色每一个固定的时间。其范围在100ms到300ms之间。我曾尝试使用Android Timer-TimerTask,但在10-15个线程后渲染延迟,然后我失去了实时更新。我也尝试过使用Thread.sleep(),但MainThreadActivity出现了一个异常。计时器问题我认为是JVM线程分配问题,或者最多是并发问题。我问你在安卓系统中安排固定延迟的快速事件的最佳方式是什么,以及我的方法是否正确 先谢谢你Java Android调度快速任务,java,android,multithreading,timer,timertask,Java,Android,Multithreading,Timer,Timertask,我对事件安排有问题。我需要改变文本颜色每一个固定的时间。其范围在100ms到300ms之间。我曾尝试使用Android Timer-TimerTask,但在10-15个线程后渲染延迟,然后我失去了实时更新。我也尝试过使用Thread.sleep(),但MainThreadActivity出现了一个异常。计时器问题我认为是JVM线程分配问题,或者最多是并发问题。我问你在安卓系统中安排固定延迟的快速事件的最佳方式是什么,以及我的方法是否正确 先谢谢你 法比奥试试这样: final static in
法比奥试试这样:
final static int REFRESH_TIME_MS = 100;
final static int REFRESH_TIME_MS_2 = 200;
Runnable mPeriodicTask = new Runnable() {
public void run() {
//do what you want
}
};
Runnable mPeriodicTask_2 = new Runnable() {
public void run() {
//do what you want
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
executor.scheduleAtFixedRate(mPeriodicTask, 0, REFRESH_TIME_MS, TimeUnit.MILLISECONDS);
executor.scheduleAtFixedRate(mPeriodicTask_2, 0, REFRESH_TIME_MS_2, TimeUnit.MILLISECONDS);
}
试试倒计时。它在UI线程上执行,并为您提供自上次调用以来经过了多少时间的确切信息。 添加一个更清晰的示例: 假设您希望在300毫秒、150毫秒和75毫秒之后更新视图 总时间为525ms,最小间隔为50ms 因此:
未经测试,因此不是100%确定会起作用,但它应该会给你一个想法我已经尝试过,但在倒计时中,第二个参数[例如:new CountDownTimer(30000,1000)]不是可变的,是costant。我需要第二次辩论的固定时间。你说的是科斯坦特是什么意思?好的。我没有解释清楚。我不需要固定的时间!!这是一个示例场景:我有一个总秒数(倒计时的第一个参数)。第一个事件-->我在300毫秒后更改文本颜色;第二个事件-->我在150ms后更改文本颜色;第三个事件-->我在150毫秒后更改文本颜色…………这意味着倒计时计时器非常适合您。只需将更新时间设置为您所需的最短时间,并根据您在回调中得到的计时器完成时间自己进行计算。帕斯夸尔,很抱歉打扰你,你能给我举个例子吗?此链接使用固定参数。我不懂回调机制。你可以给我举个例子吗?看看这个例子,在这个例子中,postDelayed方法的毫秒值是固定的。我需要一个变量值。然后使用posttime()嗨,丹尼斯,我需要安排n个事件,而不仅仅是一个。这个例子展示了我是如何安排一个事件的,还是我错了?你可以安排n个事件。Denis,我知道我只需要安排一个运行时就可以安排多少个事件。这不是一个固定的数额。我需要实现一种机制来安排可变数量的事件。您可以随时添加另一个事件并删除已添加的事件。有什么问题吗?提供您当前的实现以澄清问题。
private class TestCT extends CountDownTimer{
private long mFirstTime;
private long mTotalTime;
private long mLastRecognizedEvent=0;
public TestCT(long millisInFuture, long countDownInterval, long firstEventTime) {
super(millisInFuture, countDownInterval);
mTotalTime=millisInFuture;
mFirstTime=firstEventTime;
}
@Override
public void onTick(long millisUntilFinished) {
long elapsed=mTotalTime-millisUntilFinished;
elapsed-=mLastRecognizedEvent;
if(elapsed>=mFirstTime){
updateTheView();
mLastRecognizedEvent+=mFirstTime;
mFirstTime=mFirstTime/2;
}
}
@Override
public void onFinish() {
updateTheView();
}
}
new TestCT(525,50,300).start();