13

我需要将一些字符串的 Http 发布到 Web 服务。我正在使用 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;
}

因此,当我使用 Wifi 连接时,这工作正常,但使用 3G 会在 16 - 18 秒内失败并抛出 HttpResponseException。

我不敢相信问题是运行异步的 DefaultHttpClient ,因为那样它也应该在 Wifi 上引发错误。


编辑
Web 服务是用 C# 编写的,并使用 JSON 响应。

这里要求的是 logcat,在 18 秒内给出 HttpResponseException,正如我在原始问题中所说:

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/>


结束编辑

这是我应该走的路:http
://www.vogella.com/articles/AndroidNetworking/article.html那么我如何使用这种方法发布数据实体?

4

8 回答 8

6

您可以尝试通过手机的网络浏览器连接到您的服务器,以查看问题是否在您的应用程序中,或者问题是否是 3G 问题解决/连接到您的服务器地址。

我的猜测是您将无法通过网络浏览器进行连接。

您的网络服务托管在哪里?它应该可以从外部网络访问吗?如果服务器在同一个网络中,您可以通过 wifi 连接到您的服务器。

于 2013-07-22T09:47:40.357 回答
4

您需要进行以下故障排除:

  1. 确认您的 3G 确实有效。打开一些标准网站,如雅虎。
  2. 尝试确认您的 3G 网络是否真的可以解析您提到的地址。如果没有,您可以直接尝试IP地址。如果此步骤解决了您的 DNS 无法正确解析地址。
  3. 如果以上两个步骤都失败,请重启设备,切换飞行模式,然后重试。有时 3G 网络与重置一起使用。
于 2013-07-22T09:38:05.717 回答
3
  • 基本上在一些偏远地区,3G 连接速度不如 wifi。尝试检查您的 3G 是否为您提供数据连接序列。如果不是,则它无法“发布”

  • 接下来,您必须检查发布时间限制。如果您花费太多时间来发布,那么发布时会出现错误是很常见的。尝试给出一些最大时间限制以发布大量数据

  • 不要使用异步,而是尝试使用处理程序或服务类在后台上传一些东西。

由于我是 android 的初学者,这就是我心中的所有选择。如果超出此范围,对我们将更有帮助。

于 2013-07-23T09:46:53.097 回答
3

看来您遇到了与我相同的问题。我花了很多时间调试我的代码,但这个问题解决了我所有的问题->您的服务器可以从公共互联网访问吗? android 为什么向服务器发送信息仅适用于 WIFI?

于 2013-07-22T20:57:07.997 回答
3

这些错误经常出现,因为代理无法将域名解析为地址。

此问题完全是由于后端计算机之间的 IP 通信速度较慢,可能包括 Web 服务器。只有在托管 Web 服务器的站点上设置网络的人员才能解决此问题。

于 2013-07-22T09:35:41.423 回答
1

我希望你在用户界面线程上运行操作。避免这种情况

于 2013-07-18T08:24:48.497 回答
1

对于 Android 2.3 (Gingerbread) 及更高版本,建议使用HttpUrlConnection而不是 HttpClient。请参阅此 Android 团队帖子: http ://android-developers.blogspot.com/2011/09/androids-http-clients.html

HttpClient 可能在您使用的设备上存在问题,并且通过 3G 发送数据存在问题。

此外,在使用 HttpURLConnection 时,请务必在执行 HTTP 请求之前调用此方法:

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");
    }
}
于 2013-07-23T21:08:49.473 回答
1

我有时也有同样的问题……为什么?因为在我的情况下超时...取决于您正在下载的字节数...因为您是否尝试过对 ws 的简单调用?它有效吗?=>> 超时。

于 2013-07-18T14:41:21.213 回答