error with AsyncTask - android.os.NetworkOnMainThreadExcepti



我收到错误: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中设置图像。

最新更新