Java android在另一个重复任务完成时运行重复任务
我有一个任务,执行时间为10秒,1秒不延迟,另一个任务在第一个任务完成时执行时间为30秒,5秒 另外,当按下按钮时,我需要取消这两项任务 我不知道解决这个问题的最好办法是什么Java android在另一个重复任务完成时运行重复任务,java,android,multithreading,executorservice,Java,Android,Multithreading,Executorservice,我有一个任务,执行时间为10秒,1秒不延迟,另一个任务在第一个任务完成时执行时间为30秒,5秒 另外,当按下按钮时,我需要取消这两项任务 我不知道解决这个问题的最好办法是什么 我尝试了基本线程,但将阻止GUI,直到两个任务都完成 执行 我试过执行器服务执行器服务= Executors.newSingleTheadExecutor()但我在这种情况下 executor.submit(可运行)一个接一个地执行任务,但不执行 每个周期 我尝试使用固定利率的计划执行人,但 计划执行器是异步的,我知道如何
executor.submit(可运行)
一个接一个地执行任务,但不执行
每个周期executorService.scheduleAtFixedRate(runnable1, delay, period);
//and after finished to run
executorService.scheduleAtFixedRate(runnable2, delay, period);
或者你可以使用。它允许您在后台执行工作而不阻塞UI线程,然后在必要时对UI进行更新。您可以使用
倒计时类。我模拟了一个简单的演示
我创建了两个Runnable
任务来模拟VolumeUp和VolumeDown函数
当timerUp
启动时,它将在给定的时间内计数。完成timerUp
计数后,在onFinish
中启动timerDown
。它倒计时
public class TimerActivity extends AppCompatActivity {
private TextView out;
int value = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timer);
out = (TextView) findViewById(R.id.out);
setText(value);
timerUp.start();
}
CountDownTimer timerUp = new CountDownTimer(10000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
runnable1.run();
}
@Override
public void onFinish() {
timerDown.start();
}
};
CountDownTimer timerDown = new CountDownTimer(10000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
runnable2.run();
}
@Override
public void onFinish() {
Log.e("done", "onFinish");
}
};
private void setText(final int value){
runOnUiThread(new Runnable() {
@Override
public void run() {
out.setText(String.valueOf(value));
}
});
}
Runnable runnable1 = new Runnable() {
@Override
public void run() {
value += 10;
setText(value);
}
};
Runnable runnable2 = new Runnable() {
@Override
public void run() {
value -= 10;
setText(value);
}
};
}
可以通过呼叫取消计时器
timerUp.cancel();
timerDown.cancel();
您可能需要稍微调整一下时间值。希望你能明白。祝你好运 > MaltkBand和K Neeraj Lal提供了一些很好的答案,这将有助于你的特定情况(你需要使用异步线程来阻止UI线程),但是为了响应这些事件,你应该考虑为整个项目采用ReActux方法。它简化了在整个应用程序代码中有关精心计时的事件的通信。这是一个更大规模的增加,包括学习使用开源库,但从现在起将加快您的开发
看
和更多信息
或者另一个好的选择:
您能用其他的话(或图纸)解释一下您希望如何安排它们吗?我不明白。。。任务1“以1秒的时间毫无延迟地执行10秒”-那么每秒钟启动一个Task1实例?任务2的第一个实例应该在什么时候开始?当然。任务1以每秒10%的速度增加声音(铃声)音量,持续10秒。完成此任务后,体积将达到100%。然后,第二个任务每5秒减少15%的音量,因此在第二个任务结束时,如果我计算正确的话,音量将达到总音量的10%。您是否尝试使用两个for
循环和一些Thread.sleep()
语句?是的。这解决了我的问题,但阻止了ui线程,直到两个任务都完成。请详细说明您的问题,如果可能的话,用一些例子,我确实知道在我的问题中是否有用。我需要定期执行两个任务,任务1的周期为1秒,任务2的周期为5秒。每个任务都会更新UI线程上的音量设置。您介意更新帖子以包含线程块吗?我假设您正在使用runOnUiThread()
来更新UI,但是否有可能您在runOnUiThread()
中做了太多的工作?@Fildor我同意这一点,这是过分的,但如果整个代码中有十几个这样的问题,就不会了。