Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android在另一个重复任务完成时运行重复任务_Java_Android_Multithreading_Executorservice - Fatal编程技术网

Java android在另一个重复任务完成时运行重复任务

Java android在另一个重复任务完成时运行重复任务,java,android,multithreading,executorservice,Java,Android,Multithreading,Executorservice,我有一个任务,执行时间为10秒,1秒不延迟,另一个任务在第一个任务完成时执行时间为30秒,5秒 另外,当按下按钮时,我需要取消这两项任务 我不知道解决这个问题的最好办法是什么 我尝试了基本线程,但将阻止GUI,直到两个任务都完成 执行 我试过执行器服务执行器服务= Executors.newSingleTheadExecutor()但我在这种情况下 executor.submit(可运行)一个接一个地执行任务,但不执行 每个周期 我尝试使用固定利率的计划执行人,但 计划执行器是异步的,我知道如何

我有一个任务,执行时间为10秒,1秒不延迟,另一个任务在第一个任务完成时执行时间为30秒,5秒

另外,当按下按钮时,我需要取消这两项任务

我不知道解决这个问题的最好办法是什么

  • 我尝试了基本线程,但将阻止GUI,直到两个任务都完成 执行
  • 我试过执行器服务执行器服务= Executors.newSingleTheadExecutor()但我在这种情况下
    executor.submit(可运行)
    一个接一个地执行任务,但不执行 每个周期

  • 我尝试使用固定利率的计划执行人,但 计划执行器是异步的,我知道如何使用

    executorService.scheduleAtFixedRate(runnable1, delay, period);      
    //and after finished to run
    executorService.scheduleAtFixedRate(runnable2, delay, period);
    
  • 任何反馈都将不胜感激

    致以最良好的祝愿, AurelianR可用于重复执行任务


    或者你可以使用。它允许您在后台执行工作而不阻塞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我同意这一点,这是过分的,但如果整个代码中有十几个这样的问题,就不会了。