我想使用以下代码读取 URL 的内容:
myUrl=new URL(url);
stream=myUrl.openStream();
但是第二行代码触发了“android.os.NetworkOnMainThreadException”,没有任何其他解释。
我在 Androïd 4 下工作,我可以添加此代码用于与 Androïd 2.3.3 一起工作。
任何的想法?
提前感谢您花时间帮助我。
所以问题是应用程序试图在主线程上执行网络操作,这是不允许的。
为了您的目标,我建议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;
}
或者这里是类似的主题:
来自 Android 开发者的网站:
当应用程序尝试在其主线程上执行网络操作时,会引发 NetworkOnMainThreadException。
您需要将代码放在单独的线程或 AsyncTask 中。
Android 3.0 及以上版本对 UI 线程的滥用更加严格阅读本文了解更多详情
您现在需要使用 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,这听起来很法国。