-4

我正在尝试从我的应用程序中获取 Web 资源并收到 NetworkOnMainThreadException。当我从 Eclipse 尝试它时,它工作正常。我已<uses-permission android:name="android.permission.INTERNET"/>在我的 AndroidManifest.xml 文件中添加,但它仍然无法正常工作。我还添加-dns-server 8.8.8.8了我的运行配置设置,但仍然没有。如果我在模拟器中打开浏览器应用程序就可以了。关于可能出错/如何解决的任何其他建议?

谢谢!

android.os.NetworkOnMainThreadException 在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 在 java.net.InetAddress.lookupHostByName(InetAddress.java:385) 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java: 236) 在 java.net.InetAddress.getAllByName(InetAddress.java:214) 在 libcore.net.http.HttpConnection.(HttpConnection.java:70) 在 libcore.net.http.HttpConnection.(HttpConnection.java:50) 在libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 在 libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 在 libcore.net.http.HttpConnection.connect(HttpConnection.java: 128) 在 libcore.net.http.HttpEngine.connect(HttpEngine.java:311) 在 libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316).net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 在 libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 在 libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81) 在 org .apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:117) at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:155) at com.weathertest.WeatherClient.getWeather(WeatherClient.java:41 ) 在 com.weathertest.MainActivity$1.onClick(MainActivity.java:44) 在 android.view.View.performClick(View.java:4204) 在 android.view.View$PerformClick.run(View.java:17355) 在android.os.Handler.handleCallback(Handler.java:725) 在 android.os.Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread .main(ActivityThread.java:5041) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$ MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method)

更新:Doh,我想我没有意识到在添加互联网权限后异常发生了变化。我以前从未见过因为在错误的线程上运行某些东西而引发异常,这是有道理的,你大多数时候都不想这样做,但是,一个异常,真的......

正如所指出的,这是一个很好的参考:How to fix android.os.NetworkOnMainThreadException?

显然这就是 Honeycomb SDK 或更高版本的情况,可以在此处找到注意事项:http: //developer.android.com/training/articles/perf-anr.html

4

2 回答 2

3

您不得从主 UI 线程访问互联网,例如您的onCreate()方法。从单独的Thread/Runnable或发送您的互联网命令AsyncTask,您的NetworkOnMainThreadException问题将得到解决。

Android 不允许这样做,以确保您不会在长时间任务期间挂起 UI,因为它会强制您在备用线程中执行耗时的活动。

示例

Thread thread = new Thread()
{
    @Override
    public void run() {
        talkToTheInternet();
    }
};
thread.start();

这只是许多可能的方法之一。

您可能希望显示 a并在完成ProgressDialog时关闭它。Thread在这个论坛上有很多这样做的例子。

于 2013-03-29T22:08:27.433 回答
1

android.os.NetworkOnMainThreadException

这是大多数用户在开始开发 android 应用程序时面临的著名异常。

原因:
Android 3.x 或更高版本的设备不允许在 UI Thread 中执行网络操作,当您尝试这样做时,它会抛出异常,说您正在 UI Thread 上执行网络操作。所以你需要做的是创建一个单独的线程来执行网络操作或AsyncTask。

于 2013-03-29T22:11:07.897 回答