TimerTask无法在调用线程上运行

时间:2014-07-23 21:01:12

标签: android timer timertask

我有一个应该随机改变状态的计时器。我需要它开始,然后在新的随机时间后再次运行。但是当我尝试调用它时,我遇到了一个问题,我告诉我它无法在错误的线程上运行:“无法在没有调用Looper.prepare()的线程内创建处理程序”。

我怎么能避免这个?

public class GameScreen extends Screen {
    public void startTimer(){

            scanTask = new TimerTask() {

                    public void run() {
                        random = new Random();
                        int randState= random.nextInt(3);
                        state = randState;  
                    }
            };

            int rand = random.nextInt(7);
            timer.schedule(scanTask, (rand + 4) * 1000);
        }


        public void stopScan(){

            if(scanTask!=null){
                scanTask.cancel();
            }

        }

    public GameScreen(Game game) {
            super(game);

            startTimer();
    }
}

这是错误堆栈。

07-23 20:49:28.917: E/AndroidRuntime(330): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
07-23 20:49:28.917: E/AndroidRuntime(330):  at android.os.Handler.<init>(Handler.java:121)
07-23 20:49:28.917: E/AndroidRuntime(330):  at com.testApp.myApp.GameScreen.<init>(GameScreen.java:35)
07-23 20:49:28.917: E/AndroidRuntime(330):  at com.testApp.myApp.GameScreen.MainMenuScreen.update(MainMenuScreen.java:26)
07-23 20:49:28.917: E/AndroidRuntime(330):  at com.testApp.framework.implementation.AndroidFastRenderView.run(AndroidFastRenderView.java:41)
07-23 20:49:28.917: E/AndroidRuntime(330):  at java.lang.Thread.run(Thread.java:1019)

1 个答案:

答案 0 :(得分:0)

您正在自己的班级中创建Handler,此课程不会延伸Looper

您可以让您的课程延长Looper,并建议致电prepare()

然而,在自定义类中使用Handlers的需求通常很少。也许你可以找到并删除它

无论如何,它与TimerTask

无关