自从我在ICS上测试我的应用程序以来,我面临着一个奇怪的问题。
在Android 2.X上使用以下代码可以很好地工作(有时会发生超时,但很少会发生):
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, SOCKET_TIMEOUT);
final DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
// Create a new HttpClient and Post Header
HttpPost httpPost = new HttpPost(url);
HttpResponse response = null;
try {
if (keys != null) {
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));
}
// Cookies
// Create a local instance of cookie store
if (checkCookieValues()) {
BasicClientCookie cookieSession = new BasicClientCookie(mCookieName, mCookieValue);
cookieSession.setDomain(mCookieDomain);
httpClient.getCookieStore().clear();
httpClient.getCookieStore().addCookie(cookieSession);
}
// Execute HTTP Post Request
response = httpClient.execute(httpPost);
httpClient.getConnectionManager().shutdown();
} catch (UnknownHostException e) {
Log.e(TAG, "Error when calling postData", e);
} catch (SocketTimeoutException e) {
Log.e(TAG, "Error when calling postData", e);
} catch (ClientProtocolException e) {
Log.e(TAG, "Error when calling postData", e);
} catch (SocketException e) {
Log.e(TAG, "Error when calling postData", e);
} catch (IOException e) {
Log.e(TAG, "Error when calling postData", e);
}
return response;在ICS上,只要我收到超时异常,所有后续调用都将返回超时异常。
Timeout exception received :
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): org.apache.http.conn.ConnectTimeoutException: Connect to /78.109.91.193:80 timed out
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at com.kreactive.planningtv.service.PlanningTVService.postData(PlanningTVService.java:1554)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at com.kreactive.planningtv.service.PlanningTVService.fbConnect(PlanningTVService.java:1897)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at com.kreactive.planningtv.service.PlanningTVService.onHandleIntent(PlanningTVService.java:569)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at android.os.Handler.dispatchMessage(Handler.java:99)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at android.os.Looper.loop(Looper.java:137)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at android.os.HandlerThread.run(HandlerThread.java:60)有没有人遇到这个问题?有没有办法避免这个问题?我检查了一下,没有发现类似的问题(特别是针对ICS )。
感谢您的回复!
发布于 2014-10-13 12:56:24
在Android应用程序中,您应该避免在用户界面线程上执行长时间运行的操作。这包括文件和网络访问。
StrictMode允许在应用程序中设置策略,以避免做不正确的事情。从安卓3.0 (蜂巢) StrictMode被配置为崩溃与NetworkOnMainThreadException异常,如果在用户界面线程中访问网络。
而你应该在后台线程中进行网络访问。
如果您的目标是Android3.0或更高版本,您可以在活动的onCreate()方法的开头通过以下代码关闭此检查。
StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 不建议将其关闭。
发布于 2012-02-20 00:15:40
在ICS中,Apache http堆栈已被弃用和破坏。铬现在是标准。确保v8是设备的默认java脚本引擎。
https://stackoverflow.com/questions/9165194
复制相似问题