Android 计时器-0致命错误
我正在使用计时器调用WebService,它将每5秒轮询一次。这是我的代码Android 计时器-0致命错误,android,timer,android-asynctask,Android,Timer,Android Asynctask,我正在使用计时器调用WebService,它将每5秒轮询一次。这是我的代码 timer=new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { // TODO Auto-generated method stub new MyWS().execute(URL); } }
timer=new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
new MyWS().execute(URL);
}
}, 1000, 5000);
但它在MyWS().execute(URL)处给了我致命的异常;线路。
下面显示了log cat
05-30 11:46:47.299: E/AndroidRuntime(2801): FATAL EXCEPTION: Timer-0
05-30 11:46:47.299: E/AndroidRuntime(2801): java.lang.ExceptionInInitializerError
05-30 11:46:47.299: E/AndroidRuntime(2801): at com.example.vuzixvideo.MainActivity$1.run(MainActivity.java:59)
05-30 11:46:47.299: E/AndroidRuntime(2801): at java.util.Timer$TimerImpl.run(Timer.java:284)
05-30 11:46:47.299: E/AndroidRuntime(2801): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-30 11:46:47.299: E/AndroidRuntime(2801): at android.os.Handler.<init>(Handler.java:121)
05-30 11:46:47.299: E/AndroidRuntime(2801): at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:607)
05-30 11:46:47.299: E/AndroidRuntime(2801): at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:607)
05-30 11:46:47.299: E/AndroidRuntime(2801): at android.os.AsyncTask.<clinit>(AsyncTask.java:190)
05-30 11:46:47.299:E/AndroidRuntime(2801):致命异常:计时器-0
05-30 11:46:47.299:E/AndroidRuntime(2801):java.lang.ExceptionInInitializeError
05-30 11:46:47.299:E/AndroidRuntime(2801):在com.example.vuzixvideo.MainActivity$1.run(MainActivity.java:59)
05-30 11:46:47.299:E/AndroidRuntime(2801):在java.util.Timer$TimerImpl.run(Timer.java:284)
05-30 11:46:47.299:E/AndroidRuntime(2801):原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
05-30 11:46:47.299:E/AndroidRuntime(2801):在android.os.Handler.(Handler.java:121)
05-30 11:46:47.299:E/AndroidRuntime(2801):在android.os.AsyncTask$InternalHandler。(AsyncTask.java:607)
05-30 11:46:47.299:E/AndroidRuntime(2801):在android.os.AsyncTask$InternalHandler。(AsyncTask.java:607)
05-30 11:46:47.299:E/AndroidRuntime(2801):在android.os.AsyncTask.(AsyncTask.java:190)
您在计时器中执行的操作必须尝试在主UI线程上执行。试试这个:
timer=new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
new MyWS().execute(URL);
}
});
}
}, 1000, 5000);
或者可能是这样:
private Timer mTimer1;
private TimerTask mTt1;
private Handler mTimerHandler = new Handler(Looper.getMainLooper());
private void stopTimer(){
if(mTimer1 != null){
mTimer1.cancel();
mTimer1.purge();
}
}
private void startTimer(){
mTimer1 = new Timer();
mTt1 = new TimerTask() {
public void run() {
mTimerHandler.post(new Runnable() {
public void run(){
new MyWS().execute(URL);
}
});
}
};
mTimer1.schedule(mTt1, 1, 5000);
}
这将在主循环器上创建一个处理程序,计时器将向其发布操作。我没有测试它,但它应该可以工作。请参阅线程规则@。使用带有alaram的服务manager@Raghunandan:因此,为了使用轮询,我需要使用处理程序,但我尝试了,这不是轮询TimerTask在不同的线程上运行。支持您在ui线程上调用asynctask。再次阅读发布的链接。同时阅读Handler.timertask的用法。它在后台运行,然后使用
runOnUiThread
。asynctask doinbackground也在后台线程上运行。我想op需要一个service@bstar:THnx。。真的吗helped@Rohit服务就是你想要的。定时器+处理器良好luck@Raghunandan:我知道定时器+处理器会很快耗尽我的电池电量,也会占用我的系统资源,AlarmManager
是一个不错的选择。但我只是在做一些实验