【问题标题】:Android can't read from URLAndroid 无法读取 URL
【发布时间】:2011-08-21 22:20:04
【问题描述】:

我在使用 URL 类从 Android 工作区中的文件读取文本时遇到问题。我得到一个 NetworkOnMainThreadException。完全相同的代码在 Android 工作区之外工作,因此它必须是网络或权限问题。我从指定的链接生成了一个基本的文本文件。 看来它在 url.openStream 上失败了。 下面是我的代码,后面是我的清单文件(我已经在其中添加了 uses-permissions 行。)

  static public String[] barList()
{ 
   ArrayList<String> bars = new ArrayList<String>();
   try{
       URL url = new URL("****");
       BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
       String line = br.readLine();
       while(line != null)
       {
           bars.add(line);
           line = br.readLine();
       }
       br.close();
   }
   catch (IOException e) {
       e.printStackTrace();
   }
   return (String[])bars.toArray();
}

这是清单文件。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="aexp.explist">
<application>
    <activity android:name=".ExpList" android:label="ExpList">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest> 

【问题讨论】:

  • 异常是否暗示发生了什么? e.getMessage()
  • 由于某种原因,当我调试程序时,异常没有被捕获。它没有把我带到 catch 块,而是把我带到一个“Class.class”文件。
  • 当这种情况发生并且您处于 DDMS 透视图中时,单击绿色的“播放”按钮继续。如有必要,请多次执行此操作,您最终应该会在 LogCat 选项卡中看到堆栈跟踪。顺便说一句,我仅在 Internet 权限的情况下在我的模拟器中测试了您的代码,我没有收到任何错误。
  • 我听从了您的建议,发现我收到了“NetworkOnMainThreadException”。我在调用从 url 打开输入流时得到了这个。我正在尝试在 Android 3.2,API 级别 13 上运行它。
  • 我暂时无法访问我的 Android 开发框,但看起来在您所针对的 API 中,您不允许在主线程上执行网络操作。您可能必须将此代码移动到一个线程,或者可能是一个 AsyncTask。详情请参阅developer.android.com/reference/android/os/…developer.android.com/guide/practices/design/…

标签: java android android-emulator


【解决方案1】:

也许您的流已压缩: GZIPInputStream fails with IOException in Android 2.3, but works fine in all previous releases?

如果你不使用缓冲输入流,你能读取 url 内容吗?

另外,我经常使用 url.getContent 并将其转换为输入流,这是可行的,我不熟悉 url.openStream。

问候, 斯蒂芬

【讨论】:

  • 进一步检查,它在 url.openStream 上失败。所以它在失败之前甚至没有到达 BufferedInput 代码。尝试使用 (InputStream)url.getContent 也不起作用。在我看来,这可能是一个权限问题。也许从 https 网站阅读?
  • 你会得到一个权限异常,而不是一个 ioexception。无论如何,您向您的应用授予互联网权限,不应该那样。
【解决方案2】:

如果我将代码粘贴到当前项目中并从其运行,您的代码可以正常运行而不会引发异常。我的目标是 sdk 4-8。

【讨论】:

    【解决方案3】:

    希望有所帮助:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2020-08-22
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多