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()?
时会发生什么还有其他解决方案吗?
提前谢谢
答案 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
}
}
字符串内容应该是全局性的。 请试一试。