Android 定时器和异步同步
我想在计时器线程内触发AsynTask,我得到以下错误 java.lang.ExceptionInInitializeError 原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序 有没有可能??? 这是我的密码Android 定时器和异步同步,android,timer,Android,Timer,我想在计时器线程内触发AsynTask,我得到以下错误 java.lang.ExceptionInInitializeError 原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序 有没有可能??? 这是我的密码 networkTimer = new Timer(); networkTimer.schedule(new TimerTask() { in
networkTimer = new Timer();
networkTimer.schedule(new TimerTask() {
int counter = 1;
@Override
public void run() {
// TODO Auto-generated method stub
if(isNetworkAvailable()){
Log.d("Hey I got the Network","!!");
new GmailAsync().execute("");
networkTimer.cancel();
}else{
Log.d("Attempt","No:"+counter);
counter++;
if(counter == 6){
Log.d("Attempt","Finished");
networkTimer.cancel();
}
}
}
},0, 5000);
AsyncTask.execute()
必须在UI线程上运行,而TimerTask没有
建议:
*使用runOnUiThread返回UI线程以使用异步任务
*不要使用计时器,而是使用处理程序和postDelyaed
*如果您不需要与UI交互,请不要使用AsyncTask(您可以这样做,但我不知道AsyncTask是做什么的)
最好的解决方案是#2。它看起来像:
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if(isNetworkAvailable()){
Log.d("Hey I got the Network","!!");
new GmailAsync().execute("");
}else{
Log.d("Attempt","No:"+counter);
counter++;
if(counter == 6){
Log.d("Attempt","Finished");
} else {
mHandler.postDelayed(this, 5000);
}
}
}, 5000);
}
只要计数器<6,runnable repost本身只需将对FinderMain$1.gotLocation的每个调用或其中异步任务的创建包装在runnable中,并将其发布到绑定到UI线程的处理程序中,如下所示:
class GetLastLocation extends TimerTask {
private Handler mHandler = new Handler(Looper.getMainLooper());
@Override
public void run() {
// ...
mHandler.post(new Runnable() {
public void run() {
locationResult.gotLocation(null);
}
});
// ...
}
}
唯一的疑问是isNetworkAvailable是否真的测试了一个网络连接,在这种情况下,您将拥有NetworkOnIthread这是非常繁重的,而且非常重要,因为处理程序可以完全替换计时器和timertask。而且,我看不出与这个问题有任何实际联系。(例如,没有异步任务或网络)