Java 使用TimerTask每X秒进行一次Http请求
我想每X秒向服务器发送一次请求,并获得结果。 如果不使用timer,它工作正常,但如果使用timer.scheduleAtFixedRate,则会出现异常: “无法在未调用Looper.prepare()的线程内创建处理程序” 我怎样才能摆脱这个? 谢谢Java 使用TimerTask每X秒进行一次Http请求,java,android,timer,httprequest,timertask,Java,Android,Timer,Httprequest,Timertask,我想每X秒向服务器发送一次请求,并获得结果。 如果不使用timer,它工作正常,但如果使用timer.scheduleAtFixedRate,则会出现异常: “无法在未调用Looper.prepare()的线程内创建处理程序” 我怎样才能摆脱这个? 谢谢 public类MainMap扩展了ActionBarActivity实现了LocationListener、View.OnClickListener{ @凌驾 创建时受保护的void(Bundle savedInstanceState){ in
public类MainMap扩展了ActionBarActivity实现了LocationListener、View.OnClickListener{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
int initialDelay=1000;
整数周期=5000;
定时器=新定时器();
TimerTask任务=新的TimerTask(){
公开募捐{
//每5秒请求一次
设置位置();
}
};
timer.scheduleAtFixedRate(任务、初始延迟、周期);
}
公共无效设置位置(){
getCurrentLocation();
ArrayList dataDelete=新建ArrayList();
Map mUserDelete=新HashMap();
if(isOnline){
mUserDelete.put(“可用”,String.valueOf(1));
}否则{
mUserDelete.put(“可用”,String.valueOf(0));
}
mUserDelete.put(“id”,user.getId());
mUserDelete.put(“经度”,String.valueOf(经度));
mUserDelete.put(“纬度”,String.valueOf(纬度));
添加(新的JSONObject(mUserDelete));
JSONArray jsonArrayDelete=新的JSONArray();
jsonArrayDelete.put(dataDelete);
final JSONObject jsonObjectDelete=new JSONObject();
试一试{
put(“请求”,jsonArrayDelete);
新建AsyncServerRequest().execute(jsonObjectDelete);
}捕获(JSONException e){
d(Constants.tag,“JSONException:+e.getMessage());
}
}
public void getCurrentLocation(){
lm=(LocationManager)getSystemService(Context.LOCATION\u服务);
location=lm.getLastKnownLocation(LocationManager.GPS\U提供程序);
lm.RequestLocationUpdate(LocationManager.GPS_提供程序,2000,10,locationListener);
longitude=location.getLongitude();
纬度=位置。getLatitude();
}
公共类AsyncServerRequest扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的void onPostExecute(长期){
super.onPostExecute(沿);
}
@凌驾
受保护的长doInBackground(最终JSONObject…JSONObject){
最终HttpRequest请求=新的HttpRequest(uriStatus,jsonObjects[0]);
makeHttpRequest();
返回null;
}
}
}
问题在于这行代码
new AsyncServerRequest().execute(jsonObjectDelete);
您不能也不应该从后台线程启动AsyncTask
,而是始终从UI线程启动。而且您可能不需要AsyncTask
,因为TimerTask
已经在后台线程上运行了
new AsyncServerRequest().execute(jsonObjectDelete);