AsyncTask HttpPost execute fails on 3G, but works on Wifi
Asked Answered
C

8

13

I need to do a Http post of some strings to a web service. I am using KSoap. (partly based on this answer by kuester2000)

@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?

Chirography answered 4/7, 2013 at 15:10 Comment(6)
I remember having something similar. In my case the server was in local network, the issue was with server's gateway.Trust
Hi there, what was the issue?Chirography
does you 3G connection goes through proxy?Cork
can you put your logcat? maybe with 3G you get timeoutXiphisternum
Look this, it seems you are having the same issue i had, Your server is accessible from the public internet? #17305998Chancellorship
My problem is the other way around. My HTTP post works only on 3G/LTE but never with WiFi connectivity.Alboran
G
6

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.

Gilbertson answered 22/7, 2013 at 9:47 Comment(0)
M
4

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.
Meliorate answered 22/7, 2013 at 9:38 Comment(0)
R
3

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.

Refugee answered 22/7, 2013 at 9:35 Comment(0)
C
3

It seems you are having the same issue i had. I spend a lot of time debugging my code but this question solve all my issues-> Your server is accessible from the public internet? android why sending information to server works with WIFI only?

Chancellorship answered 22/7, 2013 at 20:57 Comment(0)
G
3
  • Basically in some remote area 3G connectivity is not as much speed like wifi. Try to check your 3G is providing you sequence of data connection. If not, then it fails to "post"

  • Next, you have to check the posting time limit. If you take too much time to post,its common to get error while posting. Try to give some maximum time limit in-order to post huge data

  • Instead of using asyn, try to use Handlers or service class to upload something in background.

Since i'm beginner to android,this are all the options in my mind. It will be more helpful for us if something beyond to this.

Goldwin answered 23/7, 2013 at 9:46 Comment(0)
G
1

I hope you are running operations on the user interface thread. Avoid that

Glycosuria answered 18/7, 2013 at 8:24 Comment(1)
Async task doInBackground does not run on the UI thread: developer.android.com/reference/android/os/AsyncTask.html "invoked on the background thread immediately after onPreExecute() finishes executing. This step is used to perform background computation that can take a long time... The result of the computation must be returned by this step and will be passed back to the last step. This step can also use publishProgress(Progress...) to publish one or more units of progress. These values are published on the UI thread, in the onProgressUpdate(Progress...) step."Chirography
A
1

i had sometimes same problem ... why? because time out in my case ... depends quantity of bytes are you downloading .... Because did you try a simple call to ws?is it works? =>> time out.

Afc answered 18/7, 2013 at 14:41 Comment(1)
Hi there, thank you for the answer but the login mechanism is VERY simple (I send maybe 8 strings maximum, receive the same amount). So I don't think it's quantity.Chirography
P
1

For Android 2.3 (Gingerbread) and higher, the HttpUrlConnection is recommended instead of the HttpClient. See this Android team post: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

It's possible that HttpClient is buggy on the device you're using and there are issues sending data over 3G.

Also, be sure to call this method before doing an HTTP request when using the HttpURLConnection:

private void disableConnectionReuseIfNecessary() {
    // HTTP connection reuse which was buggy pre-froyo
    if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
        System.setProperty("http.keepAlive", "false");
    }
}
Possess answered 23/7, 2013 at 21:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.