假设您有此类管理计时器。这只是一个考验。
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)
我试着寻找这个错误,但我找不到类似的东西。 谢谢!!
答案 0 :(得分:0)
如果您想使用Looper.prepere()
Handler
默认情况下,线程没有与之关联的消息循环; 创建一个,在运行循环的线程中调用prepare(), 然后循环()让它处理消息,直到循环停止。
但是你的代码中的问题实际上就在这一行:
private MainActivity main = new MainActivity();
实际上有两个问题。首先 - 看起来你没有在主线程上创建CueTimer
,导致MainActivity
的实例化也不在主线程上。第二 - 永远不要直接实例化活动。您的活动应在AndroidManifest.xml
中注册,并通过Intent
访问。