为什么connection.getResponseCode()在doInBackground()之外失败?

时间:2014-04-21 03:08:01

标签: android android-asynctask httpurlconnection

    public String urltobody(String createdurl){ 
            URL url = new URL (createdurl); 
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            int responseCode = connection.getResponseCode();//fails here
            if (responseCode == HttpURLConnection.HTTP_OK) { 
                InputStream is = connection.getInputStream();
                String content = convertInputStream(is, "UTF-8"); 
                is.close();
                return content;
            }
    }

如果我在doInBackground中调用它但在onPostExecute中不起作用,则上述函数有效。我真的需要将此函数称为独立于pre,background,post prdocedure。

这是我的班级定义private class FetchTask extends AsyncTask < Void, Void, String>

如果您能帮助我解决以下问题之一,请告诉我。

你知道如何在doInbackground之外调用我的函数吗?

你知道当我调用新的FetchTask()。execute()?

时会发生什么

还有其他解决方案吗?

提前谢谢

2 个答案:

答案 0 :(得分:0)

原因是doInBackground后台主题中运行,而onPreExectute onPostExecute UI主题中运行

==&GT; Url Connections应该不能从UI线程完成,(因为它可能会在加载时冻结UI),这就是为什么Android会在您尝试执行此操作时抛出NetworkOnMainThreadException的原因。

==&GT;这就是为什么你应该只从后台线程而不是UI线程异步建立网络连接的原因。这就是为什么它只适用于doInBackground。

答案 1 :(得分:0)

您可以尝试此代码

private class FetchTask extends AsyncTask<Void, Void, Boolean>

而不是

private class FetchTask extenends AsyncTask < Void, Void, String>

可以解决您的问题。

也是为了您的理解

private class ResponseLocDepts extends AsyncTask<Void, Void, Boolean> {
        @Override
        protected Boolean doInBackground(Void... params) {
                URL url = new URL (createdurl); 
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        int responseCode = connection.getResponseCode();//fails here
        if (responseCode == HttpURLConnection.HTTP_OK) { 
            InputStream is = connection.getInputStream();
            String content = convertInputStream(is, "UTF-8"); 
            is.close();
            return true;
        }
       else
        {
         return false;
         }

        }

        @Override
        protected void onPostExecute(final Boolean success) {
                // somethings

        }

    }

字符串内容应该是全局性的。 请试一试。