Android安排快速任务

时间:2013-12-10 14:48:01

标签: java android multithreading timer timertask

我遇到了事件调度问题。我需要每隔一段时间更改文字颜色。范围在100ms到300ms之间。我试过使用Android Timer - TimerTask但是在10-15线程之后渲染被延迟然后我丢失了实时更新。我也尝试过使用Thread.sleep(),但我有一个MainThreadActivity异常。计时器问题我认为这是JVM线程分配或者至多是并发问题。我问你在Android中安排具有固定延迟的快速事件的最佳方法是什么,如果我的方法是正确的。

提前谢谢。

Fabio

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

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

答案 1 :(得分:0)

尝试使用CountDownTimer。它在UI线程上执行,并为您提供有关自上次调用以来经过多长时间的信息。 添加一个更清楚的例子: 我们假设你想在300毫秒,150毫秒和75毫秒后更新视图 这使得总时间为525ms,最小间隔为50ms

这样:

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

未对此进行测试,因此不是100%肯定会起作用,但它应该给你一个想法

相关问题