AsyncTask HttpPost выполняет сбой по 3G, но работает на Wi-Fi

Мне нужно сделать Http-сообщение некоторых строк для веб-службы. Я использую 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;
}

Так что это отлично работает, когда я использую Wi-Fi для подключения, но использование 3G не выполняется в течение 16 - 18 секунд, бросая исключение HttpResponseException.

Я не могу поверить, что это DefaultHttpClient, выполняющий async, что является проблемой, потому что тогда он должен также выбросить ошибку на Wi-Fi.


РЕДАКТИРОВАТЬ
Веб-службы написаны на С# и используют ответы JSON.

В соответствии с запросом здесь находится логарифм, который дает исключение HttpResponseException через 18 секунд, как я сказал в исходном вопросе:

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

Так я должен идти: http://www.vogella.com/articles/AndroidNetworking/article.html
Затем, как я могу отправить данные с помощью этого метода?

Ответ 1

Вы можете попытаться подключиться к своему серверу через веб-браузер своего телефона, чтобы узнать, есть ли проблема в вашем приложении или проблема связана с проблемой 3G, разрешающей/подключающейся к адресу вашего сервера.

Я предполагаю, что вы не сможете подключиться ни через веб-браузер.

Где размещен ваш веб-сервис? Должен ли он быть доступен из внешней сети? Вы можете подключиться к вашему серверу через Wi-Fi, если сервер находится в одной сети.

Ответ 2

Вам необходимо выполнить следующие действия по устранению неполадок:

  1. Подтвердите, что ваш 3G действительно работает. Откройте некоторые стандартные веб-сайты, такие как yahoo.
  2. Попробуйте подтвердить, может ли ваша сеть 3G действительно разрешить указанный вами адрес. Если нет, вы можете попробовать IP-адрес напрямую. Если этот шаг решает, чем ваш DNS не сможет правильно решить адрес.
  3. Если эти два шага не работают, перезагрузите устройство, переключите режим полета и повторите попытку. Иногда сеть 3G работает с перезагрузкой.

Ответ 3

Эти ошибки часто возникают из-за того, что прокси не смог разрешить доменное имя в адрес.

Эта проблема полностью связана с медленной IP-связью между внутренними компьютерами, возможно, включая веб-сервер. Исправить эту проблему могут только люди, которые настроили сеть на сайте, на котором размещен веб-сервер.

Ответ 5

  • В принципе, в какой-то отдаленной области связь 3G не такая высокая, как Wi-Fi. Попробуйте проверить, что ваш 3G предоставляет вам последовательность подключения к данным. Если нет, то он не сможет "отправить",

  • Затем вы должны проверить лимит времени проводки. Если вы занимаете слишком много времени, чтобы опубликовать сообщение, его общее для получения ошибки при публикации. Попытайтесь дать максимальный лимит времени для публикации огромных данных

  • Вместо использования asyn попробуйте использовать Handlers или класс обслуживания для загрузки чего-либо в фоновом режиме.

Поскольку я новичок в Android, это все варианты в моем сознании. Это будет более полезно для нас, если что-то еще не для этого.

Ответ 6

Я надеюсь, что вы выполняете операции над потоком пользовательского интерфейса. Избегайте

Ответ 7

У меня была такая же проблема... почему? потому что время в моем случае... зависит от количества байтов, которые вы загружаете.... Потому что вы попробовали простой вызов ws? Это работает? =>> тайм-аут.

Ответ 8

Для Android 2.3 (Gingerbread) и выше рекомендуется HttpUrlConnection вместо HttpClient. См. Это сообщение для команды Android: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Возможно, что HttpClient неисправен на устройстве, которое вы используете, и есть проблемы с отправкой данных по 3G.

Кроме того, не забудьте вызвать этот метод перед выполнением HTTP-запроса при использовании 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");
    }
}