Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.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_Timer_Timertask - Fatal编程技术网

Java Android调度快速任务

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

我对事件安排有问题。我需要改变文本颜色每一个固定的时间。其范围在100ms到300ms之间。我曾尝试使用Android Timer-TimerTask,但在10-15个线程后渲染延迟,然后我失去了实时更新。我也尝试过使用Thread.sleep(),但MainThreadActivity出现了一个异常。计时器问题我认为是JVM线程分配问题,或者最多是并发问题。我问你在安卓系统中安排固定延迟的快速事件的最佳方式是什么,以及我的方法是否正确

先谢谢你


法比奥

试试这样:

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