Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AsyncTask HttpPost execute fails on 3G, but works on Wifi

I need to do a Http post of some strings to a web service. I am using KSoap.

@Override
protected JSONObject doInBackground(JSONObject... params) {
    String result;

    HttpParams httpParameters = new BasicHttpParams();
    // Set the timeout in milliseconds until a connection is established.
    // The default value is zero, that means the timeout is not used. 
    int timeoutConnection = 30000;
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
    // Set the default socket timeout (SO_TIMEOUT) 
    // in milliseconds which is the timeout for waiting for data.
    int timeoutSocket = 50000;
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

    HttpClient httpclient = new DefaultHttpClient(httpParameters);
    setupClient(httpclient);
    //HttpURLConnection httpclient = new HttpURLConnection(_url);

    Log.d(TAG, "Posting to ["+_url+"]");
    HttpPost postdata = new HttpPost(_url);

    ...set up parameters

    ResponseHandler<String> handler = new BasicResponseHandler();  
    Calendar c = Calendar.getInstance();
    long start = c.getTimeInMillis();
    try {               
        Log.d(TAG, "Starting post data call ["+_url+"]");           
        result = httpclient.execute(postdata,handler);
        c = Calendar.getInstance();
        long total = c.getTimeInMillis() - start;
        Log.d(TAG, "Finished post data call ["+result+"] in ["+total+"] millis");
    }catch(HttpResponseException e)
    {
        c = Calendar.getInstance();
        long total = c.getTimeInMillis() - start;
        Log.e(TAG, "HttpResponseException: ["+total+"] millis. There was a problem communicating: " + e.getMessage());
        return null;
    }catch (ClientProtocolException e) {
        Log.e(TAG, "ClientProtocolException There was a problem getting to the service: " + e.getMessage());
        return null;
    } catch(SocketTimeoutException e){
        Log.e(TAG, "SocketTimeoutException There was a problem connecting: " + e.getMessage());
        return null;        
    } catch (IOException e) {
        Log.e(TAG, "IOException There was a problem reading the data: " + e.getMessage());
        return null; 
    }  
    catch(Exception e)
    {
        Log.e(TAG, "Exception An error occurred: " + e.toString());
        return null;
    }
    httpclient.getConnectionManager().shutdown();
    JSONObject resp = null;
    try {
        resp = new JSONObject(result);          
    } catch (JSONException e) {
        resp = null;
        e.printStackTrace();
    }

    Log.i(TAG, result.toString());  
    return resp;
}

So this works fine when I use Wifi to connect, but using 3G is fails in 16 - 18 seconds throwing a HttpResponseException.

I cannot believe that it's the DefaultHttpClient running async that is the issue, because then it should throw the error on Wifi as well.


EDIT
The web services are written in C#, and use JSON responses.

As requested here is the logcat, giving the HttpResponseException in 18 seconds, as I said in the original question:

07-22 11:13:04.678: D/ProgressBar(26524): setProgress = 0<br/>
07-22 11:13:04.678: D/ProgressBar(26524): setProgress = 0, fromUser = false<br/>
07-22 11:13:04.678: D/ProgressBar(26524): mProgress = 0mIndeterminate = false, mMin = 0, mMax = 10000<br/>
07-22 11:13:31.968: D/GpsLocation(26524): Got location<br/>
07-22 11:13:32.018: D/WebService(26524): BASE ADDRESS [http://[SERVICEURL]]<br/>
07-22 11:13:32.023: D/ProgressBar(26524): setProgress = 0<br/>
07-22 11:13:32.023: D/ProgressBar(26524): setProgress = 0, fromUser = false<br/>
07-22 11:13:32.023: D/ProgressBar(26524): mProgress = 0mIndeterminate = false, mMin = 0, mMax = 10000<br/>
07-22 11:13:32.048: D/HttpPostWebServiceTask(26524): Posting to [http://[SERVICEURL]/Authentication/Authenticate]<br/>
07-22 11:13:32.053: D/HttpPostWebServiceTask(26524): Starting post data call [http://[SERVICEURL]/Authentication/Authenticate]<br/>
07-22 11:13:47.758: D/dalvikvm(26524): GC_CONCURRENT freed 258K, 17% free 8062K/9671K, paused 22ms+25ms, total 157ms<br/>
**07-22 11:13:50.728: E/HttpPostWebServiceTask(26524): HttpResponseException: [18671] millis. There was a problem communicating: Gateway Timeout**<br/>
07-22 11:13:50.778: D/GOT RESPONSE(26524): NULL RESPONSE FROM SERVER<br/>
07-22 11:13:50.778: E/HttpPostWebServiceTask(26524): Error invoking command: null<br/>
07-22 11:13:50.783: W/System.err(26524): java.lang.NullPointerException<br/>
07-22 11:13:50.793: W/System.err(26524):    at com.app.webservices.WebService.checkValidResponse(WebService.java:82)<br/>
07-22 11:13:50.793: W/System.err(26524):    at com.app.webservices.WebService.access$0(WebService.java:76)<br/>
07-22 11:13:50.793: W/System.err(26524):    at com.app.webservices.WebService$1.execute(WebService.java:120)<br/>
07-22 11:13:50.793: W/System.err(26524):    at com.app.webservices.WebService$1.execute(WebService.java:1)<br/>
07-22 11:13:50.793: W/System.err(26524):    at com.blm.android.webservice.HttpPostWebServiceTask.onPostExecute(HttpPostWebServiceTask.java:226)<br/>
07-22 11:13:50.793: W/System.err(26524):    at com.blm.android.webservice.HttpPostWebServiceTask.onPostExecute(HttpPostWebServiceTask.java:1)<br/>
07-22 11:13:50.798: W/System.err(26524):    at android.os.AsyncTask.finish(AsyncTask.java:631)<br/>
07-22 11:13:50.798: W/System.err(26524):    at android.os.AsyncTask.access$600(AsyncTask.java:177)<br/>
07-22 11:13:50.803: W/System.err(26524):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)<br/>
07-22 11:13:50.803: W/System.err(26524):    at android.os.Handler.dispatchMessage(Handler.java:99)<br/>
07-22 11:13:50.803: W/System.err(26524):    at android.os.Looper.loop(Looper.java:137)<br/>
07-22 11:13:50.803: W/System.err(26524):    at android.app.ActivityThread.main(ActivityThread.java:4947)<br/>
07-22 11:13:50.803: W/System.err(26524):    at java.lang.reflect.Method.invokeNative(Native Method)<br/>
07-22 11:13:50.803: W/System.err(26524):    at java.lang.reflect.Method.invoke(Method.java:511)<br/>
07-22 11:13:50.803: W/System.err(26524):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)<br/>
07-22 11:13:50.808: W/System.err(26524):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)<br/>
07-22 11:13:50.808: W/System.err(26524):    at dalvik.system.NativeStart.main(Native Method)<br/>


END EDIT

Is this the way I should go: http://www.vogella.com/articles/AndroidNetworking/article.html
Then how do I post data entities using this method?

like image 717
Quintin Balsdon Avatar asked Jul 04 '13 15:07

Quintin Balsdon


3 Answers

You could try to connect to your server via the web browser of your phone to see if the problem is within your application or if the problem is a 3G problem resolving/connecting to the address of your server.

My guess is that you won't be able to connect either via a web browser.

Where is hosted your web service? Should it be accessible from an external network ? You may be able to connect to your server via wifi if the server is in the same network.

like image 158
Al_th Avatar answered Nov 28 '22 15:11

Al_th


You need to do the following troubleshooting:

  1. Confirm that your 3G actually works. Open some standard websites like yahoo.
  2. Try to confirm if your 3G network can actually resolve the address that you have mentioned. If not you can try the IP address directly. If this step solves than your DNS is not able to resolve the address correctly.
  3. If the above two steps fail, restart the device, toggle airplane mode and retry again. Sometimes the 3G network works with reset.
like image 31
PravinCG Avatar answered Nov 28 '22 15:11

PravinCG


These errors often arise because the proxy failed to resolve a domain name into an address.

This problem is entirely due to slow IP communication between back-end computers, possibly including the Web server. Only the people who set up the network at the site which hosts the Web server can fix this problem.

like image 45
Ritesh Gune Avatar answered Nov 28 '22 14:11

Ritesh Gune