HttpUrlConnection 致命错误

Posted

技术标签:

【中文标题】HttpUrlConnection 致命错误【英文标题】:HttpUrlConnection fatal error 【发布时间】:2012-05-13 00:36:02 【问题描述】:

我在使用 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): 在 java.net.InetAddress.lookupHostByName(InetAddress.java:391) 05-03 15:15:19.116: W/System.err(1085): 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 05-03 15:15:19.116: W/System.err(1085): 在 java.net.InetAddress.getAllByName(InetAddress.java:220) 05-03 15:15:19.126: W/System.err(1085): 在 libcore.net.http.HttpConnection.(HttpConnection.java:71) 05-03 15:15:19.126: W/System.err(1085): 在 libcore.net.http.HttpConnection.(HttpConnection.java:50) 05-03 15:15:19.126: W/System.err(1085): 在 libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 05-03 15:15:19.126: W/System.err(1085): 在 libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 05-03 15:15:19.126: W/System.err(1085): 在 libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 05-03 15:15:19.126: W/System.err(1085): 在 libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 05-03 15:15:19.126: W/System.err(1085): 在 libcore.net.http.HttpEngine.connect(HttpEngine.java:303) 05-03 15:15:19.126: W/System.err(1085): 在 libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 05-03 15:15:19.126: W/System.err(1085): 在 libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 05-03 15:15:19.126: W/System.err(1085): 在 libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 05-03 15:15:19.136: W/System.err(1085): 在 libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 05-03 15:15:19.136: W/System.err(1085): 在 com.BertacchiMazzoni.HTTPClient.HttpClientTutorial.test(HttpClientTutorial.java:35) 05-03 15:15:19.136: W/System.err(1085): 在 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): 在 java.lang.reflect.Method.invokeNative(Native Method) 05-03 15:15:19.146: W/System.err(1085): 在 java.lang.reflect.Method.invoke(Method.java:511) 05-03 15:15:19.146: W/System.err(1085): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 05-03 15:15:19.146: W/System.err(1085): 在 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)

我可以解决这个问题吗?哪里出错了?

非常感谢! 问候!

【问题讨论】:

您是否在清单文件中授予了 INTERNET 权限... 【参考方案1】:

一个快速的谷歌异常会引导你到这里:http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

其中规定:

当应用程序尝试执行 在其主线程上进行网络操作。

这仅针对以 Honeycomb SDK 为目标的应用程序或 更高。允许针对早期 SDK 版本的应用程序执行 在他们的主事件循环线程上联网,但它很重 灰心。请参阅文档设计响应性。

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

【讨论】:

【参考方案2】:

将您的代码移至后台线程。

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

当操作系统版本为ICS时,我们无法在Main UI Thread中访问网络,它可以保护您的应用程序在进行长时间操作时不会阻塞UI。

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于HttpUrlConnection 致命错误的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:1:1:序言中不允许内容

通过HttpURLConnection模拟post表单提交

HttpURLConnection 通过代理访问时返回 503 错误

HttpURLConnection读取403错误的响应内容[重复]

HttpURLConnection 411错误解决

java HttpURLConnection隧道错误407