Android:引起:android.os.NetworkOnMainThreadException [重复]

Posted

技术标签:

【中文标题】Android:引起:android.os.NetworkOnMainThreadException [重复]【英文标题】:Android : Caused by: android.os.NetworkOnMainThreadException [duplicate] 【发布时间】:2013-10-16 11:43:48 【问题描述】:
String response = getResultForRequest(url);

其中 'url' 是 JSON 格式,使用 http GET 方法返回一堆数据。

public static String getResultForRequest(String urlString)
        throws IOException 
    URL url = new URL(urlString);
    HttpURLConnection urlConnection = (HttpURLConnection) url
            .openConnection();
    urlConnection.setRequestMethod("GET");
    urlConnection.setDoInput(true);
    urlConnection.setDoOutput(true);
    urlConnection.connect();

    InputStream is = urlConnection.getInputStream();
    if (is == null)
        return null;
    StringBuffer sb = new StringBuffer();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String line = null;
    try 
        while ((line = br.readLine()) != null)
            sb.append(line);
     finally 
        br.close();
        is.close();
    

    return sb.toString();

我无法从 getResultForRequest(url) 方法中传递的“url”获取 JSON 格式的数据。urlConnection.connect(); 中出现错误。 androidManifest.xml 文件中也给出了 Internet 权限。

这是我的日志。

10-09 13:27:35.264: E/AndroidRuntime(9984): FATAL EXCEPTION: main
10-09 13:27:35.264: E/AndroidRuntime(9984): java.lang.RuntimeException: Unable to start activity ComponentInfo: android.os.NetworkOnMainThreadException
10-09 13:27:35.264: E/AndroidRuntime(9984):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at android.app.ActivityThread.access$600(ActivityThread.java:140)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at android.os.Looper.loop(Looper.java:137)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at android.app.ActivityThread.main(ActivityThread.java:4898)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at java.lang.reflect.Method.invokeNative(Native Method)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at java.lang.reflect.Method.invoke(Method.java:511)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at dalvik.system.NativeStart.main(Native Method)
10-09 13:27:35.264: E/AndroidRuntime(9984): Caused by: android.os.NetworkOnMainThreadException
10-09 13:27:35.264: E/AndroidRuntime(9984):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:165)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at com.csoft.foursquare.FoursquareService.getResultForRequest(Service.java:564)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at com.csoft.foursquare.FoursquareService.getUserDetails(Service.java:376)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at com.csoft.checkin.CheckinHistoryActivity.onCreate(HistoryActivity.java:52)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at android.app.Activity.performCreate(Activity.java:5206)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
10-09 13:27:35.264: E/AndroidRuntime(9984):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
10-09 13:27:35.264: E/AndroidRuntime(9984):     ... 11 more

提前致谢。

【问题讨论】:

请关闭这个问题,它已经被问过并回答了无数次 要下载 JSON,您可以使用“Volley”,它会为您完成工作 kpbird.com/2013/05/volley-easy-fast-networking-for-android.html 【参考方案1】:

在你的 onCreate() 中添加这个:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

使用上述作为临时解决方案。否则使用线程或异步任务。

【讨论】:

请避免使用上面的代码。在文档中你会看到:关于 StrictMode 的“非常不鼓励”......似乎你正在主线程上做一些网络请求,你只需要将请求或 respose.getEntity 移动到 AsyncTask,这是解决您问题的正确方法.. 我已经在答案中说过了。仅使用给定的代码作为临时解决方案,否则使用线程/异步任务。 感谢您节省了我的时间。【参考方案2】:

您正尝试在主 (UI) 线程上建立网络连接。这在 Android 中是不允许的,因为它会暂停整个 UI,直到您从服务器获得响应。

尝试使用 AsyncTask,或在单独的线程上执行连接。

希望这会有所帮助。

【讨论】:

【参考方案3】:

NetworkOnMainThreadException:当应用程序尝试在其主线程上执行网络操作时引发的异常。

您应该在 asynctask 上调用方法,然后只有代码才能工作。为避免它,您应该在另一个线程上调用它。因此 asynctask 更好。

http://android-developers.blogspot.in/2009/05/painless-threading.html

http://android-er.blogspot.in/2012/04/androidosnetworkonmainthreadexception.html

http://www.lucazanini.eu/2012/android/the-android-os-networkonmainthreadexception-exception/?lang=en

这里是说明如何使用 asynctask 的链接

【讨论】:

感谢@Tamilan。我已经完成了 AsyncTask。但问题是当我在 4.0 以上运行此代码时,无法从 url 获取数据。但在 Gingerbread 中,它完美显示意味着数据应该很好地显示。我不明白发生了什么问题。 如果目标 sdk 版本 >= 14 或 >=15(我不确定,对不起),只会抛出此异常 @Sandra 可能会为所有人提供帮助 我知道当我的应用程序设置为目标 sdk 9 时,它没有给出异常。但设置为 14,id 确实如此。 @Sandra 那么你应该使用 asynctask。

以上是关于Android:引起:android.os.NetworkOnMainThreadException [重复]的主要内容,如果未能解决你的问题,请参考以下文章

引起:android.system.ErrnoException:绑定失败:EACCES(权限被拒绝)

Android 非45度倍数角度渐变引起的崩溃

Android 非45度倍数角度渐变引起的崩溃

Android合规问题引起的https证书校验

Android合规问题引起的https证书校验

如何捕获由单击android活动的右上角X引起的事件