HttpURLConnection在Android姜饼中不起作用,但在JellyBean中工作良好
我遇到了一个有趣的问题,我试图使用HttpURLConnection下载一个XML文件。 该代码在android 4.2上运行良好,但在2.3.4上不起作用 任何帮助都将不胜感激 代码如下所示HttpURLConnection在Android姜饼中不起作用,但在JellyBean中工作良好,android,httpurlconnection,android-4.2-jelly-bean,android-2.3-gingerbread,Android,Httpurlconnection,Android 4.2 Jelly Bean,Android 2.3 Gingerbread,我遇到了一个有趣的问题,我试图使用HttpURLConnection下载一个XML文件。 该代码在android 4.2上运行良好,但在2.3.4上不起作用 任何帮助都将不胜感激 代码如下所示 package com.test.testdownloader; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader;
package com.test.testdownloader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((Button) findViewById(R.id.button1))
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
try {
downloadtest();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
void downloadtest() throws IOException {
URL url = new URL("http://someurl/list.xml");
new DownloadTask().execute(url);
}
private class DownloadTask extends AsyncTask<URL, Integer, String> {
@Override
protected String doInBackground(URL... urls) {
try {
URL url = urls[0];
InputStream is = inputStreamForUrl(url);
String result = getStringFromInputStream(is);
System.out.println(result);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
// convert InputStream to String
private static String getStringFromInputStream(InputStream is) {
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
String line;
try {
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
public static InputStream inputStreamForUrl(URL url) throws IOException {
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoInput(true);
urlConnection.setConnectTimeout(30000);
urlConnection.setReadTimeout(30000);
urlConnection.connect();
return urlConnection.getInputStream();
}
}
package com.test.testdownloader;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
公共类MainActivity扩展了活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((按钮)findViewById(R.id.button1))
.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图arg0){
试一试{
下载测试();
}捕获(IOE异常){
e、 printStackTrace();
}
}
});
}
void downloadtest()引发IOException{
URL=新URL(“http://someurl/list.xml");
新建下载任务().execute(url);
}
私有类DownloadTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(URL…URL){
试一试{
URL=URL[0];
InputStream is=inputStreamForUrl(url);
字符串结果=getStringFromInputStream(is);
系统输出打印项次(结果);
返回结果;
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
}
//将InputStream转换为字符串
私有静态字符串getStringFromInputStream(InputStream为){
BufferedReader br=null;
StringBuilder sb=新的StringBuilder();
弦线;
试一试{
br=新的BufferedReader(新的InputStreamReader(is));
而((line=br.readLine())!=null){
某人附加(行);
}
}捕获(IOE异常){
e、 printStackTrace();
}最后{
如果(br!=null){
试一试{
br.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
使某人返回字符串();
}
公共静态InputStream inputStreamForUrl(URL URL)引发IOException{
HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod(“GET”);
urlConnection.setDoInput(true);
urlConnection.setConnectTimeout(30000);
urlConnection.setReadTimeout(30000);
urlConnection.connect();
返回urlConnection.getInputStream();
}
}
它在android 4.2和4.3中运行良好,但在2.3.4中确实会抛出此错误
08-21 11:15:55.634: W/System.err(5719): java.net.SocketTimeoutException: Connection timed out
08-21 11:15:55.644: W/System.err(5719): at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
08-21 11:15:55.644: W/System.err(5719): at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:357)
08-21 11:15:55.654: W/System.err(5719): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:204)
08-21 11:15:55.654: W/System.err(5719): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:437)
08-21 11:15:55.654: W/System.err(5719): at java.net.Socket.connect(Socket.java:983)
08-21 11:15:55.664: W/System.err(5719): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:75)
08-21 11:15:55.664: W/System.err(5719): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
08-21 11:15:55.664: W/System.err(5719): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:322)
08-21 11:15:55.674: W/System.err(5719): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
08-21 11:15:55.674: W/System.err(5719): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:285)
08-21 11:15:55.674: W/System.err(5719): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:267)
08-21 11:15:55.684: W/System.err(5719): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205)
08-21 11:15:55.684: W/System.err(5719): at com.test.testdownloader.MainActivity.inputStreamForUrl(MainActivity.java:99)
08-21 11:15:55.694: W/System.err(5719): at com.test.testdownloader.MainActivity$DownloadTask.doInBackground(MainActivity.java:51)
08-21 11:15:55.694: W/System.err(5719): at com.test.testdownloader.MainActivity$DownloadTask.doInBackground(MainActivity.java:1)
08-21 11:15:55.694: W/System.err(5719): at android.os.AsyncTask$2.call(AsyncTask.java:185)
08-21 11:15:55.694: W/System.err(5719): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
08-21 11:15:55.694: W/System.err(5719): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
08-21 11:15:55.694: W/System.err(5719): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-21 11:15:55.694: W/System.err(5719): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-21 11:15:55.694: W/System.err(5719): at java.lang.Thread.run(Thread.java:1019)
08-21 11:15:55.634:W/System.err(5719):java.net.SocketTimeoutException:连接超时
08-21 11:15:55.644:W/System.err(5719):位于org.apache.harmony.luni.platform.OSNetworkSystem.connect(本机方法)
08-21 11:15:55.644:W/System.err(5719):位于dalvik.System.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:357)
08-21 11:15:55.654:W/System.err(5719):位于org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:204)
08-21 11:15:55.654:W/System.err(5719):位于org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:437)
08-21 11:15:55.654:W/System.err(5719):位于java.net.Socket.connect(Socket.java:983)
08-21 11:15:55.664:W/System.err(5719):位于org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.(HttpConnection.java:75)
08-21 11:15:55.664:W/System.err(5719):位于org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.(HttpConnection.java:48)
08-21 11:15:55.664:W/System.err(5719):位于org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:322)
08-21 11:15:55.674:W/System.err(5719):位于org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
08-21 11:15:55.674:W/System.err(5719):位于org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:285)
08-21 11:15:55.674:W/System.err(5719):位于org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:267)
08-21 11:15:55.684:W/System.err(5719):位于org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205)
08-21 11:15:55.684:W/System.err(5719):位于com.test.testdownloader.MainActivity.inputStreamForUrl(MainActivity.java:99)
08-21 11:15:55.694:W/System.err(5719):位于com.test.testdownloader.MainActivity$DownloadTask.doInBackground(MainActivity.java:51)
08-21 11:15:55.694:W/System.err(5719):位于com.test.testdownloader.MainActivity$DownloadTask.doInBackground(MainActivity.java:1)
08-21 11:15:55.694:W/System.err(5719):在android.os.AsyncTask$2.call(AsyncTask.java:185)
08-21 11:15:55.694:W/System.err(5719):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
08-21 11:15:55.694:W/System.err(5719):在java.util.concurrent.FutureTask.run(FutureTask.java:138)处
08-21 11:15:55.694:W/System.err(5719):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-21 11:15:55.694:W/System.err(5719):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-21 11:15:55.694:W/System.err(5719):在java.lang.T
public static class Connector extends AsyncTask<String, Object, Object> {
private static final int DEFAULT_CNN_TIME_OUT = 1000 * 20;
private static String USER_AGENT;
private String mUrl;
private byte[] mBody;
public Connector( Context _cxt ) {
super();
if( TextUtils.isEmpty( USER_AGENT ) ) {
// Without this, the default provided by API will be like "Dalvik/1.6.0 (Linux; U; Android 4.0.4; BASE_Lutea_3 Build/IMM76D)" .
USER_AGENT = new WebView( _cxt ).getSettings().getUserAgentString();
}
}
/*
* Convenient function to execute the connecting task.
*/
public void submit( String _url ) {
this.execute( _url );
}
@Override
protected Object doInBackground( String... _params ) {
mUrl = _params[0];
Object ret = null;
HttpURLConnection conn = null;
try {
synchronized( Connector.class ) {
InputStream in = null;
conn = connect( mUrl );
// if we don't do conn.setRequestProperty( "Accept-Encoding", "gzip" ), the wrapper GZIPInputStream can be removed.
onConnectorInputStream( in = new GZIPInputStream( conn.getInputStream() ) );
in.close();
in = null;
}
}
catch( Exception _e ) {
ret = _e;
}
finally {
if( conn != null ) {
conn.disconnect();
conn = null;
}
}
return ret;
}
@Override
protected void onPostExecute( Object _result ) {
if( _result instanceof SocketTimeoutException ) {
onConnectorConnectTimout();
} else if( _result instanceof ConnectorPostConnectException ) {
onConnectorError( ((ConnectorPostConnectException) _result).getStatus() );
} else if( _result instanceof Exception ) {
onConnectorInvalidConnect( (Exception) _result );
} else if( _result == null ) {
onConnectorFinished();
}
handleEstablishedConnection();
}
/*
* Internal help and test function.
*/
private static void handleEstablishedConnection() {
try {
Log.v( TAG, "Connection is established." );
CookieStore cs = CookieManager.getInstance().getCookieStore();
if( cs != null ) {
Log.v( TAG, "------------cookies------------" );
List<Cookie> list = cs.getCookies();
if( list != null && list.size() > 0 ) {
StringBuilder cookieBuilder = new StringBuilder();
for( Cookie c : list ) {
cookieBuilder
.append( c.getName().trim() )
.append( "=>" )
.append( c.getValue().trim() )
.append( "=>" )
.append( c.getDomain() );
Log.v( TAG, cookieBuilder.toString() );
cookieBuilder.delete( 0, cookieBuilder.length() - 1 );
}
cookieBuilder = null;
} else {
Log.v( TAG, "Empty cookies." );
}
cs = null;
list = null;
}
}
catch( Exception _e ) {
Log.e( TAG, "Error in handleEstablishedConnection: " + _e.getMessage() );
}
finally {
}
}
private HttpURLConnection connect( String _urlStr ) throws Exception {
URL url = null;
HttpURLConnection conn = null;
try {
try {
url = new URL( _urlStr );
}
catch( MalformedURLException e ) {
throw new IllegalArgumentException( "Invalid url: " + _urlStr );
}
conn = preConnect( url );
doConnect( conn );
conn = postConnect( conn );
}
catch( Exception _e ) {
throw _e;
}
finally {
url = null;
}
return conn;
}
private HttpURLConnection preConnect( URL url ) throws Exception {
HttpURLConnection conn;
conn = (HttpURLConnection) url.openConnection();
conn.setUseCaches( false );
// http://www.aswinanand.com/2009/01/httpurlconnectionsetfollowredirects-bug/comment-page-1/#comment-13330
// see the url to learn more about the problem of redirect
conn.setInstanceFollowRedirects( false );
conn.setDoOutput( true );// allows body
mBody = getBody();
if( hasBody() ) {
conn.setFixedLengthStreamingMode( mBody.length );
}
conn.setRequestMethod( "POST" );
conn.setRequestProperty( "Connection", "Keep-Alive" );
conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded;charset=UTF-8" );
conn.setRequestProperty( "User-Agent", USER_AGENT );
conn.setRequestProperty( "Accept-Encoding", "gzip" );// force server to send in Content-Encoding: gzip .
String cookies = onCookie();
if( !TextUtils.isEmpty( cookies ) ) {
conn.setRequestProperty( "Cookie", onCookie() );
cookies = null;
}
conn.setConnectTimeout( onSetConnectTimeout() );
return conn;
}
/*
* Convenient function to check the exiting of body.
*/
private boolean hasBody() {
return mBody != null && mBody.length > 0;
}
private void doConnect( HttpURLConnection conn ) throws Exception {
OutputStream out; // the outgoing stream
out = conn.getOutputStream();
if( hasBody() ) {
out.write( mBody );
}
out.close();
out = null;
}
private HttpURLConnection postConnect( HttpURLConnection conn ) throws Exception {
int status = conn.getResponseCode();
if( status != HttpURLConnection.HTTP_OK ) {
throw new ConnectorPostConnectException( status );
} else {
CookieManager.getInstance().put( conn.getURL().toURI(), conn.getHeaderFields() );
return conn;
}
}
private byte[] getBody() {
byte[] body = null;
String bodyString = onSetBody();
if( !TextUtils.isEmpty( bodyString ) ) {
body = bodyString.getBytes();
}
return body;
}
// ------------------------------------------------
// Overrides methods here
// ------------------------------------------------
protected int onSetConnectTimeout() {
return DEFAULT_CNN_TIME_OUT;
}
protected String onCookie() {
return null;
}
protected String onSetBody() {
return null;
}
protected void onConnectorConnectTimout() {
Log.e( TAG, "Handling connector timeout gracefully." );
}
protected void onConnectorError( int _status ) {
Log.e( TAG, "Handling connector error(responsed) gracefully: " + _status );
}
protected void onConnectorInvalidConnect( Exception _e ) {
Log.e( TAG, "Handling connector invalid connect(crash) gracefully: " + _e.toString() );
}
/*
* Read data here. The function runs in thread. To hook on UI thread use onConnectorFinished()
*/
protected void onConnectorInputStream( InputStream _in ) {
}
/*
* Last handler for a success connection
*/
protected void onConnectorFinished() {
}
}
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.server.url", 8080));
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(proxy);