我想使用以下代码阅读URL的内容:
myUrl=new URL(url);
stream=myUrl.openStream();
但是第二行代码触发了“android.os.NetworkOnMainThreadException”而没有任何其他解释。
我在Androïd4下工作,我可以添加用于Androïd2.3.3的代码。
有什么想法吗?
提前感谢你花时间去帮助我。
答案 0 :(得分:1)
问题是应用程序尝试在主线程上执行网络操作,这是不允许的。
为了您的目标,我建议您使用AsyncTask
并在后台Thread
开展工作。
以下是我的小应用程序中的示例:
protected InputStream doInBackground(String... params) {
int contentLength = 0;
int buffLength = 0;
int progress = 0;
InputStream inputStream = null;
try {
URL url = new URL(params[0]);
HttpURLConnection urlConntection = (HttpURLConnection) url.openConnection();
urlConntection.setRequestMethod("GET");
urlConntection.setAllowUserInteraction(false);
urlConntection.setInstanceFollowRedirects(true);
urlConntection.connect();
if (urlConntection.getResponseCode() == HttpURLConnection.HTTP_OK) {
contentLength = urlConntection.getContentLength();
progressDialog.setMax(contentLength);
inputStream = urlConntection.getInputStream();
while ((buffLength = inputStream.read(MAX_BUFFER)) != -1) {
try {
Thread.sleep(1);
progress += buffLength;
DataTransmitted data = new DataTransmitted(progress, contentLength);
publishProgress(data);
}
catch (InterruptedException ex) {
Log.e(this.getClass().getName(), ex.getMessage());
}
}
}
else {
throw new IOException("No response.");
}
}
catch (MalformedURLException ex) {
Log.e(this.getClass().getName(), ex.getMessage());
}
catch (IOException ex) {
errorDialog.show();
}
return inputStream;
}
或者这里是类似的主题:
答案 1 :(得分:1)
来自Android开发者的网站:
当应用程序尝试在其主线程上执行网络操作时,将引发NetworkOnMainThreadException。
您需要将代码放在单独的线程或AsyncTask中。
Android版本3.0及更高版本更严格关于滥用UI线程Read this article for more details
答案 2 :(得分:1)
你现在需要使用AsyncTask这是一个简单的例子,我希望这会对你有所帮助:
public class SimpleWebGrab extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
grabURL("http://android.com");
}
public void grabURL(String url) {
new GrabURL().execute(url);
}
private class GrabURL extends AsyncTask<String, Void, Void> {
private final HttpClient Client = new DefaultHttpClient();
private String Content;
private String Error = null;
private ProgressDialog Dialog = new ProgressDialog(SimpleWebGrab.this);
protected void onPreExecute() {
Dialog.setMessage("Downloading source..");
Dialog.show();
}
protected Void doInBackground(String... urls) {
try {
HttpGet httpget = new HttpGet(urls[0]);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
Content = Client.execute(httpget, responseHandler);
} catch (ClientProtocolException e) {
Error = e.getMessage();
cancel(true);
} catch (IOException e) {
Error = e.getMessage();
cancel(true);
}
return null;
}
protected void onPostExecute(Void unused) {
Dialog.dismiss();
if (Error != null) {
Toast.makeText(SimpleWebGrab.this, Error, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(SimpleWebGrab.this, "Source: " + Content, Toast.LENGTH_LONG).show();
}
}
}
}
并且请:称之为Android,而不是Androïd,它听起来像法国人。