当另一个重复任务完成时,android运行一个重复的任务

时间:2016-12-09 16:02:29

标签: java android multithreading executorservice

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

此外,我需要在按下按钮时取消这两项任务。

我不知道哪个是这个问题的最佳解决方案。

  1. 我尝试了基本线程但会阻止GUI直到两个任务 执行
  2. 我试过ExecutorService executorService = Executors.newSingleTheadExecutor(),但我是这个案例的 executor.submit(runnable)执行一个接一个的任务但不执行 每个人定期

  3. 我尝试了预定的执行者,按计划的固定费率,但是 预定执行程序是异步的,我知道如何使用

    executorService.scheduleAtFixedRate(runnable1, delay, period);      
    //and after finished to run
    executorService.scheduleAtFixedRate(runnable2, delay, period);
    
  4. 感谢任何反馈。

    最诚挚的问候, AurelianR

3 个答案:

答案 0 :(得分:2)

您可以使用CountDownTimer课程。我嘲笑了一个简单的演示。

我创建了几个Runnable任务来模拟VolumeUp和VolumeDown函数。

timerUp开始时,它会计算给定时间。完成timerUp计数后,在timerDown中启动onFinish。倒计时。

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();

您可能需要稍微调整时间值。希望你明白这个主意。祝好运。 :)

答案 1 :(得分:1)

您可以使用AlarmManager执行重复任务。

或者您可以使用AsyncTask。它允许您在后台进行工作而不会阻止UI线程,然后在必要时对UI进行更新。

答案 2 :(得分:1)

martinkbrown和K Neeraj Lal为此提供了一些很好的答案,这将有助于您的特定情况(您需要使用异步线程来阻止阻止UI线程),但是为了响应这些事件,您应该考虑采用整个项目的ReactiveX方法。它简化了在整个应用程序代码中进行关于仔细定时事件的通信。这是一个更大规模的添加,涉及学习使用开源库,但将从现在开始加速您的开发。

请参阅 http://reactivex.io/https://github.com/ReactiveX/RxAndroid了解更多信息

或其他好的选择: https://github.com/greenrobot/EventBus