我发现以下代码应该让我从网络主机(在这种情况下我的网站)中读取目录内容
String urlStr = "http://2112design.com/tabs/drum_tabs";
URL url;
try {
url = new URL(urlStr);
java.net.URLConnection con = url.openConnection();
con.connect();
java.io.BufferedReader in =
new java.io.BufferedReader(new java.io.InputStreamReader(con.getInputStream()));
String line;
for (; (line = in.readLine()) != null; ) {
Log.d("MainActivity", "read from web "+line);
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
当我运行它时,con.connect();失败,错误跟踪如下:
android.os.NetworkOnMainThreadException
android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
java.net.InetAddress.lookupHostByName(InetAddress.java:385)
看起来存在某种权限问题StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
但是当我在同一设备上使用网络浏览器并转到该网址时,它就会正常运行。
我对webby的东西不太好,有人可以帮忙,谢谢
答案 0 :(得分:5)
您不应该在主线程上执行网络请求,例如尝试使用AsyncTask或启动新线程。
(new Thread(new Runnable() {
@Override
public void run() {
try {
url = new URL(urlStr);
java.net.URLConnection con = url.openConnection();
con.connect();
java.io.BufferedReader in =
new java.io.BufferedReader(new java.io.InputStreamReader(con.getInputStream()));
String line;
for (; (line = in.readLine()) != null; ) {
Log.d("MainActivity", "read from web "+line);
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
})).start();
或者您可以使用
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy =
new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
检查this问题以获取更多信息。
答案 1 :(得分:4)
这是因为您尝试从Android
中不允许的主线程访问网络您可以使用AsyncTask或创建另一个线程并在其中执行操作
如果您对使用AsyncTask或线程如何实现有任何疑问,请随时询问。如果你想要代码,请告诉我。
答案 2 :(得分:2)
您正在UI线程中执行网络操作。这就是你得到NetworkOnMainThreadException
的原因。
将您的代码更改为AsyncTask或更改为解决您问题的线程。
答案 3 :(得分:2)
NetworkOnMainThreadException:当应用程序尝试在其主线程上执行网络操作时引发的异常。
你应该在asynctask上调用sendfeedback方法然后只有上面的代码才能工作。由于网络服务器花费了大量时间来响应主线程变得反应迟钝。要避免它,你应该在另一个线程上调用它。因此asynctask更好。
http://android-developers.blogspot.in/2009/05/painless-threading.html
这里是说明如何使用asynctask
的链接