按钮单击时触发HTTP请求

时间:2014-11-14 10:05:49

标签: android button android-asynctask

我试图在每个按钮点击时触发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吗?

3 个答案:

答案 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没有被执行。