我正在尝试从网址获取xml,但我在HttpResponse中有一个错误。
URL例如如下:
我的代码是:
public String getXML (String url){
String result = null;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpPost = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
result = EntityUtils.toString(httpEntity);
} catch (Exception ex) {
Toast errorToast =
Toast.makeText(getApplicationContext(),
"Error reading xml", Toast.LENGTH_LONG);
errorToast.show();
}
return result;
}
我已经在清单中设置了互联网权限。 错误在行中:
HttpResponse httpResponse = httpClient.execute(httpPost);
并显示错误:
android.os.NetworkOnMainThreadException
谢谢
答案 0 :(得分:1)
您应该创建一个新线程,因为获取数据可能需要很长时间,从而阻止了UI线程。这就是你得到android.os.NetworkOnMainThreadException
的原因。
试试这个,
new Thread(new Runnable() {
@Override
public void run() {
// Your code here.
}
}).start();
此解决方案的替代方案是使用AsyncTask,它在android中提供。它具有doInBackground
方法,该方法在后台线程上运行。
答案 1 :(得分:1)
不是直接调用getXML();
,而是在主方法中编写此代码段:
{
...
String[] params = new String[]{url};
AsyncPostData apd = new AsyncPostData ();
apd.execute(params);
...
}
定义您的异步任务,如下所示:
private class AsyncPostData extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
getXML (params[0])
return null;
}
}
答案 2 :(得分:0)
I think we have a same query here
答案 3 :(得分:0)
我将从今天早些时候提出的另一个问题中重新发布这个问题:
您正尝试在主UI线程上运行网络请求。自3.0以来,Android不允许你这样做(我相信)。这样做会导致UI锁定,直到请求完成,在请求执行期间使您的应用程序无效。
您必须在新的Thread
或ASyncTask
中运行您的请求,才能加载UI线程。您可以找到有关如何使用多个线程here.
答案 4 :(得分:0)
具有4+ OS版本的Android设备不允许从主要活动调用webservices。 你有活动的HTTP请求,所以你有“android.os.NetworkOnMainThreadException”
我建议您选择AsyncTask解决方案。这是一种简单直接的运行请求或任何其他后台任务的方法,并使用具有最新OS virsion的设备调用Web服务,您必须使用AsyncTask。
它也很容易实现,例如onProgressUpdate如果您需要在运行请求时显示某种进度条。
private class YourTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
//call your methods from here
//publish yor progress here..
publishProgress((int) ((i / (float) count) * 100));
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
//action after execution success or not
}
}