调用Url.OpenStream时出现Android NetworkOnMainThreadException

时间:2013-03-28 14:59:33

标签: java android url exception networkonmainthread

在模拟器(Android 4.0.3 / API 15)上运行代码时出现此异常。打开流时会抛出异常。错误消息为null

try {
    String adress        = "xxx";
    URL url              = new URL(adress);
    InputSource source   = new InputSource(url.openStream());

} catch (Exception e) {
    (new TextView).setText("Error: "+e.getMessage());
}

URL仍在使用模拟器(在浏览器中)。

我已经清理了这个项目。

还允许互联网连接:

<uses-permission android:name="android.permission.INTERNET" />

例外:android.os.NetworkOnMainThreadException

2 个答案:

答案 0 :(得分:4)

从不在主( UI )主题上运行网络操作。

主题用于:

  • 与用户互动。
  • 渲染UI组件。

对其进行的任何长时间操作都可能会使用 ANR 消息关闭您的应用。

看看以下内容:

您可以轻松使用AsyncTaskThread来执行网络操作。

这是关于android中的线程和后台工作的精彩教程:Link

答案 1 :(得分:0)

适合我:

的Manifest.xml:

<uses-permission android:name="android.permission.INTERNET" />

的.java:

private static boolean DEVELOPER_MODE = true;
...
protected void onCreate(Bundle savedInstanceState) {

     if (DEVELOPER_MODE) {
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectDiskReads()
                 .detectDiskWrites()
                 .detectNetwork()   // or .detectAll() for all detectable problems
                 .penaltyLog()
                 .build());
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                 .detectLeakedSqlLiteObjects()
                 .detectLeakedClosableObjects()
                 .penaltyLog()
                 .penaltyDeath()
                 .build());
     }  
...
希望它有所帮助。

另见:http://developer.android.com/reference/android/os/StrictMode.html