我收到错误:android.os.NetworkOnMainThreadException。 我的应用程序在模拟器上工作正常。然后我在一些设备上检查它,它与Android版本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());
}
}
}
答案 0 :(得分:1)
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);
}
答案 1 :(得分:1)
您正在主ui线程上运行与网络相关的操作。
http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html
当应用程序尝试在其主线程上执行网络操作时引发的异常。
仅针对Honeycomb SDK或更高版本的应用程序进行此操作。 定位早期SDK版本的应用程序可以在其主要事件循环线程上进行联网,但不鼓励。
Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
.openConnection().getInputStream());
在UI线程上调用onPostExecute(param)。所以将上面的内容移到后台线程上调用doInBackground()。doInbackground。切记不要在doinBackground()中更新ui。 doInbackground计算的结果是onPostExecute(result)的参数。所以你可以在onPostExecute(结果)中更新ui。
请查看以下链接中的4个步骤
部分下的主题http://developer.android.com/reference/android/os/AsyncTask.html
答案 2 :(得分:1)
你正在调用这段代码:
Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
.openConnection().getInputStream());
。这意味着代码会再次在主线程上执行,从而导致NetworkOnMainThread exception
。将图片保存到doInBackground
中的变量中,然后将图片设置为ImageView
中的onPostCreate
。
答案 3 :(得分:1)
onPostExecute(String result)
Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
.openConnection().getInputStream());
userphoto.setImageBitmap(mIcon_val);
在主线程中执行 ,将代码移动到doInBackground
,或者尝试为上面的代码再创建一个AsyncTask,并在第一个Asynctask的{{1}上运行新的AsyncTask }} ^^
答案 4 :(得分:0)
谷歌在Android 3.0中添加了NetworkOnMainThreadException我认为这样可以迫使开发人员遵守不在UI线程上运行网络操作的最佳做法,因为它冻结了应用程序,这就是为什么它在2.X而不是4上工作正常。 X。
将所有网络操作移至doInBackground,然后仅在其他人建议的onPostExecute中设置图像。