HttpURLConnection在Android姜饼中不起作用,但在JellyBean中工作良好

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;

我遇到了一个有趣的问题,我试图使用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;
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);