【问题标题】:BufferedReader works in standard java but not in androidBufferedReader 适用于标准 java 但不适用于 android
【发布时间】:2012-11-02 23:09:52
【问题描述】:

所以我在 java 和 android 中有完全相同的代码,但由于某种原因,在 android 方法 get() 中总是无法完成工作并返回 false,但在标准 java 中它工作得很好。而且我确实在清单中拥有 Internet 权限。

代码如下:

    public boolean get(){
        try {
            jsonObject = new JSONObject(readUrl(url)); // Ignore JSON thing.
            return true;
        } catch (Exception ex) {
            return false;
        }
    }

    private String readUrl(String urlString) throws Exception {
        BufferedReader reader = null;
        try {
            URL url = new URL(urlString);
            reader = new BufferedReader(new InputStreamReader(url.openStream()));
            StringBuffer buffer = new StringBuffer();
            int read;
            char[] chars = new char[1024];
            while ((read = reader.read(chars)) != -1) {
                buffer.append(chars, 0, read);
            }

            return buffer.toString();
        } finally {
            if (reader != null) {
                reader.close();
            }
        }
    }

【问题讨论】:

  • 你在AndroidManifest.xml中添加INTERNET权限了吗?
  • 有,忘记说了。
  • 打印堆栈跟踪并添加到您的问题中。它可能只是 NetworkOperationNotallowedInUiThread。
  • @RohitMalish :在 Android 中,Service 与所有其他应用程序组件共享主线程(也称为 UI 线程)。您需要在Service 中创建一个工作线程,或者使用IntentService 在单独的线程上处理其所有工作。
  • @GabrielCoutinhoBrêtasNetto :我认为你应该得到赞扬,因为它暗示它可能是主线程异常上的网络。作为答案发布,并随时在我的评论中解释 Service 共享主线程。

标签: android url bufferedreader


【解决方案1】:

在 Android 中,当您启动一项服务时,它仍会在 主线程,也就是 UIThread 中运行,作为一种好习惯,您不应该在其中进行任何密集处理线程,因为它将锁定用户与您的应用程序的交互。因此,即使在服务中,您也必须创建自己的线程来访问网络资源。
这是Services的参考链接

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多