我试图在每个按钮点击时触发HTTP发布请求,以从android中的web服务获取一些数据。我创建了一个异步任务来发送http请求。我的代码如下:
活动
public void sendHttpRequest(View view){
//gets called on button click
new MyHttpRequestTask(this).execute();
}
MyHttpRequestTask
public class MyHttpRequestTaskextends AsyncTask<Void, Void, Void> {
@Override
protected void onPostExecute(Void result) {
//Show received data
super.onPostExecute(result);
}
@Override
protected Void doInBackground(Void... arg0) {
//Send http request
return null;
}
}
我有两个问题,一个是onPostExecute方法没有被触发,另一个是,如果我第二次或多次按下按钮,任务没有被执行。但不知怎的,我认为onPostExecute方法没有被调用是第二次没有执行任务的原因。那么,我做错了什么?我该如何摆脱这些问题?感谢
这是完整的doInBackground方法
@Override
protected Void doInBackground(Void... arg0) {
Looper.prepare();
GpsHelper gpsHelper = new GpsHelper();
LocationHelper locationHelper = new LocationHelper(mContext);
gpsHelper.turnGPSOn();
String location = locationHelper.getMyCurrentLocation();
...
String rawHtml = HttpHelper.sendPostRequest(postUrl, postParams);
HtmlHelper.processRawHtml(rawHtml);
Looper.loop();
return null;
}
它使用GPS获取当前位置,然后将当前地址发布到Web服务,然后解析并处理来自Web服务的响应。问题是由于GPS吗?
答案 0 :(得分:0)
在这里你应该像
一样调用你的方法public MyHttpRequestTask myHttpRequestTask;
public void sendHttpRequest(View view){
//gets called on button click
//Status.PENDING -- got the status when your asynch task not run yet with same instance
//Status.RUNNING -- whether it running
if(myHttpRequestTask.getStatus() == Status.FINISHED || myHttpRequestTask.getStatus() == Status.PENDING){
myHttpRequestTask = new MyHttpRequestTask(this).execute();
}
}
如果您的异步任务正在运行任务,则无需再次启动它,也不会启动它。
如果您在asynchtask的状态为完成或待处理时创建新对象,那将是可行的。请将日志或系统放在post方法中,以便您可以轻松识别它是否会被调用。请再次检查。
答案 1 :(得分:0)
请在您的代码中执行此操作,
public void sendHttpRequest(View view){
//gets called on button click
new MyHttpRequestTask().execute();
}
public class MyHttpRequestTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
//Send http request
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
//please put your code here.
}
}
尝试此代码,如果有任何问题,请在此处提及。
答案 2 :(得分:0)
经过几天的敲击和调试,我终于明白了。 由于GPS代码,onPostExecute未被执行。显然,启动gps启动了几个未终止的线程,因此onPostExecute没有被执行。