我收到错误:android.os.NetworkOnMainThreadException。我的应用程序在模拟器上运行良好。然后我在一些设备上检查了一下,它在安卓2.3.5版本下运行良好,但在第二台4.0.3版本的设备上出现错误。我使用AsyncTask如下:
private class TheTask extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
dialog = ProgressDialog.show(Main.this, "",
"Loading. Please wait...", true);
}
@Override
protected String doInBackground(String... params) {
request = new SoapObject(NAMESPACE, METHOD_NAME);
userid = new PropertyInfo();
userid.setName("UserId");
userid.setValue(UserId);
userid.setType(String.class);
request.addProperty(userid);
SoapSerializationEnvelope envp = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envp.dotNet = true;
envp.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envp);
SoapPrimitive response = (SoapPrimitive) envp.getResponse();
Response = response.toString();
} catch (Exception e) {
e.printStackTrace();
}
return Response;
}
@Override
protected void onPostExecute(String result) {
if (dialog != null) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}
try {
splitData = result.split("\;");
username.setText(splitData[0]);
URL newurl = new URL("" + WebsiteURL + "/images/profileImg/"
+ splitData[1] + "");
Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
.openConnection().getInputStream());
userphoto.setImageBitmap(mIcon_val);
} catch (Exception e) {
username.setText(e.toString());
}
}
}
您正在调用这段代码:
Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
.openConnection().getInputStream());
在onPostExecute中。这意味着代码将再次在主线程上执行,从而导致NetworkOnMainThread exception
。将图像保存到doInBackground
中的变量中,并将图像设置为onPostCreate
中的ImageView
。
onPostExecute(String result)
中的这些代码
Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
.openConnection().getInputStream());
userphoto.setImageBitmap(mIcon_val);
在主线程中执行,将代码移到doInBackground
中,或者尝试为上面的代码再创建一个AsyncTask,并在第一个AsyncTask的onPostExecute(String result)
^^上运行新的AsyncTask
try {
URL newurl = new URL("" + WebsiteURL + "/images/profileImg/"
+ splitData[1] + "");
Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
.openConnection().getInputStream());
} catch (Exception e) {
}
在onPostExecute()
中应该是在doInBackground()
中
和在onPostExecute()
中
if(mIcon_val != null){
userphoto.setImageBitmap(mIcon_val);
}
您正在主ui线程上运行与网络相关的操作。
http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html.
当应用程序尝试在其主线程上执行网络操作时引发的异常。
这只适用于以Honeycomb SDK或更高版本为目标的应用程序 允许以早期SDK版本为目标的应用程序在其主事件循环线程上进行联网,但强烈反对。
Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
.openConnection().getInputStream());
onPostExecute(param(在UI线程上调用。因此,将上面的内容移到doInBackground((。doInBackground在后台线程上调用。记住不要在doinBackground((中更新ui。doInbackground计算的结果是onPostExecute(结果(的参数。因此,您可以在onPostExecute(result(中更新ui。
请检查下面链接中的4个步骤部分下的主题
http://developer.android.com/reference/android/os/AsyncTask.html
谷歌在Android 3.0中添加了NetworkOnMainThreadException,我认为这是为了迫使开发者遵守最佳实践,不要在UI线程上运行网络操作,因为它冻结了应用程序,这就是为什么它在2.X上运行良好,而在4.X上运行不好。
将所有网络操作移到doInBackground中,然后按照其他人的建议,仅在onPostExecute中设置图像。