计时器

时间:2017-02-26 21:42:34

标签: java android

假设您有此类管理计时器。这只是一个考验。

package it.rockopera.scsremote;
import android.content.Context;
import java.util.Timer;
import java.util.TimerTask;

public class CueTimer extends Thread{
    private Context context;
    private MainActivity main = new MainActivity();
    private Timer timer;
    int elapsed = 0 ;

    public CueTimer(Context c){
        context= c;
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                elapsed+=1000;
                System.out.println("elapsed: " + String.valueOf(elapsed));                  
            }
        },0,1000); //Update text every second
    }
}

我想以这种方式从另一个类调用此方法:

CueTimer cuetimer = new CueTimer(context);
cuetimer.start()

这是错误:

  

处理:it.rockopera.scsremote,PID:7562                                                                         java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序                                                                             在android.os.Handler。(Handler.java:200)                                                                             在android.os.Handler。(Handler.java:114)                                                                             在android.app.Activity。(Activity.java:789)                                                                             at it.rockopera.scsremote.MainActivity。(MainActivity.java:47)                                                                             at it.rockopera.scsremote.CueTimer。(CueTimer.java:32)                                                                             at it.rockopera.scsremote.Client $ Read_SCS_MSGs.run(Client.java:477)                                                                             在java.lang.Thread.run(Thread.java:761)

我试着寻找这个错误,但我找不到类似的东西。 谢谢!!

1 个答案:

答案 0 :(得分:0)

如果您想使用Looper.prepere()

,每个新主题都应调用Handler
  

默认情况下,线程没有与之关联的消息循环;   创建一个,在运行循环的线程中调用prepare(),   然后循环()让它处理消息,直到循环停止。

但是你的代码中的问题实际上就在这一行:

 private MainActivity main = new MainActivity();

实际上有两个问题。首先 - 看起来你没有在主线程上创建CueTimer,导致MainActivity的实例化也不在主线程上。第二 - 永远不要直接实例化活动。您的活动应在AndroidManifest.xml中注册,并通过Intent访问。