0

I am getting and posting some data with JSONParser.makeHttpRequest. When the connection is slow it takes a while to get a response and I would like to set the timeout limit to 5 seconds. I found this post showing how to set HttpResponse timeout but couldn't integrate it with JSONParser.

Here is the code I use for HttpRequest

JSONParser jParser = new JSONParser();
List<NameValuePair> params = new ArrayList<NameValuePair>();
JSONObject json = jParser.makeHttpRequest(url, "GET", params);

I will be grateful if I can get a code snippet or a link to another post somewhere else.

Community
  • 1
  • 1
Engin Yapici
  • 5,673
  • 5
  • 22
  • 32

2 Answers2

2

Here is the code:

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
    int timeout;

// constructor
public JSONParser() {
    timeout = new Values().gettimeout();
}

// function get json from url
// by making HTTP POST or GET method
public JSONObject makeHttpRequest(String url, String method,
        List<NameValuePair> params) {

    // Making HTTP request
    try {
         HttpParams httpParameters = new BasicHttpParams();
         HttpConnectionParams.setSoTimeout(httpParameters, timeout);
        // check for request method
        if(method == "POST"){
            // request method is POST
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        }else if(method == "GET"){
            // request method is GET
            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            String paramString = URLEncodedUtils.format(params, "utf-8");
            url += "?" + paramString;
            HttpGet httpGet = new HttpGet(url);

            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        }           

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}
}

the secret is :

     HttpParams httpParameters = new BasicHttpParams();
     HttpConnectionParams.setSoTimeout(httpParameters, timeout);

and set de HttpParams in

 DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);

Adapt you code to do that ;)

Josh Crozier
  • 233,099
  • 56
  • 391
  • 304
  • All fine. But what occurs when the connection times out. I don't see any handling code (exception or whatever...). Thanks. – wmac Jan 14 '15 at 19:48
  • This worked for me for slower connection increasing the value of request timeout will do the work. My app was performing well on wifi but crashing on mobile data but when i increased my timeout it worked perfectly. credit goes to @Tobias S. Lucian – Dipen Jan 21 '15 at 16:21
0

You can use Asynctask, and stop the request after some time. See examples here.

Community
  • 1
  • 1
MeNa
  • 1,467
  • 9
  • 23