AsyncTask出错 - android.os.NetworkOnMainThreadException

时间:2013-05-28 11:08:54

标签: android multithreading

我收到错误: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());
        }

    }
}

5 个答案:

答案 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());

你的onPostExecute中的

。这意味着代码会再次在主线程上执行,从而导致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中设置图像。