我试图编写一些代码从用户那里获取一个url,之后点击提交按钮,我将获取网址并进行调用并从页面中检索html源代码。但是,我有以下例外:
W / System.err(14858):android.os.NetworkOnMainThreadException W / System.err(14858):在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
对于android 3.0来说,我尝试开发的平台似乎不允许我在main方法上使用网络资源。我知道有一些方法,比如在后台运行它或使用异步方法应该可以工作,但有人可以指导我吗?我不太确定如何去做。我是编程新手。 提前谢谢。
以下是我当前的代码,onclick方法:
String htmlCode = "";
try {
URL url = new URL("http://www.google.com");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
htmlCode += inputLine;
Log.d(LOG_TAG, "html: " + inputLine);
}
in.close();
} catch (Exception e) {
e.printStackTrace();
Log.d(LOG_TAG, "Error: " + e.getMessage());
Log.d(LOG_TAG, "HTML CODE: " + htmlCode);
}
答案 0 :(得分:1)
您可以使用Runnable或Thread,但可能最常用的Android方法是使用AsyncTask。
new AsyncTask<String, Void, String>(){
@Override
protected String doInBackground(String... urlStr){
// do stuff on non-UI thread
StringBuffer htmlCode = new StringBuffer();
try{
URL url = new URL(urlStr[0]);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
htmlCode += inputLine;
Log.d(LOG_TAG, "html: " + inputLine);
}
in.close();
} catch (Exception e) {
e.printStackTrace();
Log.d(LOG_TAG, "Error: " + e.getMessage());
Log.d(LOG_TAG, "HTML CODE: " + htmlCode);
}
return htmlCode.toString();
}
@Override
protected void onPostExecute(String htmlCode){
// do stuff on UI thread with the html
TextView out = (TextView) findViewById(R.id.out);
out.setText(htmlCode);
}
}.execute("http://www.google.com");