我需要在Web服务上做一些字符串的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;
}
因此,当我使用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
那么如何使用这种方法发布数据实体?
答案 0 :(得分:6)
您可以尝试通过手机的网络浏览器连接到您的服务器,以查看问题是否在您的应用程序中,或者问题是解决/连接到服务器地址的3G问题。
我的猜测是你无法通过网络浏览器连接。
您的网络服务托管在何处?它应该可以从外部网络访问吗?如果服务器位于同一网络中,您可以通过wifi连接到服务器。
答案 1 :(得分:4)
您需要执行以下问题排查:
答案 2 :(得分:3)
这些错误经常出现,因为代理无法将域名解析为地址。
此问题完全是由于后端计算机(可能包括Web服务器)之间的IP通信速度慢。只有在托管Web服务器的站点上设置网络的人才能解决此问题。
答案 3 :(得分:3)
你似乎遇到了同样的问题。我花了很多时间调试我的代码,但这个问题解决了我的所有问题 - &gt;您的服务器可以从公共互联网访问? android why sending information to server works with WIFI only?
答案 4 :(得分:3)
基本上在某些偏远地区,3G连接的速度并不像 无线上网。尝试检查您的3G是否为您提供数据序列 连接。如果没有,则无法“发布”
接下来,您必须检查过帐时间限制。如果您花费太多时间发布,那么在发布时会出现错误。尝试给出一些最大时间限制以发布大量数据
尝试使用处理程序或服务类在后台上传内容,而不是使用asyn。
因为我是Android的初学者,所以这是我脑子里的所有选择。如果超出此范围,对我们会更有帮助。
答案 5 :(得分:1)
我希望您在用户界面线程上运行操作。 <避免
答案 6 :(得分:1)
我有时也有同样的问题......为什么?因为在我的情况下超时...取决于您下载的字节数量....因为您尝试简单调用ws吗?它有效吗? =&GT;&GT;超时。
答案 7 :(得分: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");
}
}