HttpUrlConnection致命错误

时间:2012-05-03 13:23:46

标签: java android http

我使用类HttpUrlConnection的Android有问题,我的方法就是这样:

public InputStream test() {
        URL url = null;
        try {
            url = new URL("http://www.android.com/");
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       HttpURLConnection urlConnection = null;
    try {
        urlConnection = (HttpURLConnection) url.openConnection();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    InputStream in= null;

       try {
         in = new BufferedInputStream(urlConnection.getInputStream());
       }catch(IOException e){
           e.printStackTrace();
       }
        finally {
         urlConnection.disconnect();
       }
return in;
}

当我执行此方法时,android会生成此异常:

  

05-03 15:15:19.116:W / System.err(1085):android.os.NetworkOnMainThreadException   05-03 15:15:19.116:W / System.err(1085):在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)   05-03 15:15:19.116:W / System.err(1085):at java.net.InetAddress.lookupHostByName(InetAddress.java:391)   05-03 15:15:19.116:W / System.err(1085):at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)   05-03 15:15:19.116:W / System.err(1085):at java.net.InetAddress.getAllByName(InetAddress.java:220)   05-03 15:15:19.126:W / System.err(1085):at libcore.net.http.HttpConnection。(HttpConnection.java:71)   05-03 15:15:19.126:W / System.err(1085):at libcore.net.http.HttpConnection。(HttpConnection.java:50)   05-03 15:15:19.126:W / System.err(1085):at libcore.net.http.HttpConnection $ Address.connect(HttpConnection.java:351)   05-03 15:15:19.126:W / System.err(1085):at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)   05-03 15:15:19.126:W / System.err(1085):at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)   05-03 15:15:19.126:W / System.err(1085):at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)   05-03 15:15:19.126:W / System.err(1085):at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)   05-03 15:15:19.126:W / System.err(1085):at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)   05-03 15:15:19.126:W / System.err(1085):at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)   05-03 15:15:19.126:W / System.err(1085):at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)   05-03 15:15:19.136:W / System.err(1085):at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)   05-03 15:15:19.136:W / System.err(1085):at com.BertacchiMazzoni.HTTPClient.HttpClientTutorial.test(HttpClientTutorial.java:35)   05-03 15:15:19.136:W / System.err(1085):at com.BertacchiMazzoni.HTTPClient.HTTPClientActivity.onCreate(HTTPClientActivity.java:18)   05-03 15:15:19.136:W / System.err(1085):在android.app.Activity.performCreate(Activity.java:4465)   05-03 15:15:19.136:W / System.err(1085):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)   05-03 15:15:19.136:W / System.err(1085):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)   05-03 15:15:19.136:W / System.err(1085):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)   05-03 15:15:19.136:W / System.err(1085):在android.app.ActivityThread.access $ 600(ActivityThread.java:123)   05-03 15:15:19.136:W / System.err(1085):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1147)   05-03 15:15:19.146:W / System.err(1085):在android.os.Handler.dispatchMessage(Handler.java:99)   05-03 15:15:19.146:W / System.err(1085):在android.os.Looper.loop(Looper.java:137)   05-03 15:15:19.146:W / System.err(1085):在android.app.ActivityThread.main(ActivityThread.java:4424)   05-03 15:15:19.146:W / System.err(1085):at java.lang.reflect.Method.invokeNative(Native Method)   05-03 15:15:19.146:W / System.err(1085):at java.lang.reflect.Method.invoke(Method.java:511)   05-03 15:15:19.146:W / System.err(1085):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)   05-03 15:15:19.146:W / System.err(1085):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)   05-03 15:15:19.146:W / System.err(1085):at dalvik.system.NativeStart.main(Native Method)

我能解决这个问题吗?错误在哪里?

非常感谢! 此致!

3 个答案:

答案 0 :(得分:2)

将您的代码移至后台主题。

new Thread(){
     public void run(){
          test();
     }
}.start();

当os版本为ICS时,我们无法在主UI线程中访问网络,它保护您的应用程序在进行长时间操作时不会阻止UI。

答案 1 :(得分:2)

快速谷歌的例外情况会引导您:http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

哪个州:

  

应用程序尝试执行时抛出的异常   在其主线程上进行网络操作。

     

这仅适用于针对Honeycomb SDK或。的应用程序   更高。允许使用早期SDK版本的应用程序   他们的主要事件循环线程上的网络,但它是很重要的   泄气。请参阅文档设计响应性。

所以基本上我猜测你是在主应用程序线程上执行网络操作;对于Honeycomb而言,看起来你不能这样做。无论如何,这是一个坏主意,因为它可能会使您的应用程序挂起并显得无响应。您需要使用另一个线程或处理程序或asynctask或Loader来执行操作。

答案 2 :(得分:0)

你的日志说“android.os.NetworkOnMainThreadException”。这意味着你试图在主线程上运行这个网络代码,这不是一件好事,因为网络访问往往会阻塞很长一段时间。因此,较新的Android版本可以防止这种情况发生,并阻止您这样做。

要解决此问题,请在另一个线程中运行此代码。例如,使用AsyncTask或普通java线程。