1

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

    }
}
4

5 回答 5

1
try {
        URL newurl = new URL("" + WebsiteURL + "/images/profileImg/"
              + splitData[1] + "");
        Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
                  .openConnection().getInputStream());
        } catch (Exception e) {

    }

inonPostExecute()应该在doInBackground()

并且在onPostExecute()

if(mIcon_val != null){
   userphoto.setImageBitmap(mIcon_val);
}
于 2013-05-28T11:11:04.870 回答
1

您正在主 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(result) 的参数。所以你可以在 onPostExecute(result) 中更新 ui。

请检查以下链接中的 4 个步骤部分下的主题

http://developer.android.com/reference/android/os/AsyncTask.html

于 2013-05-28T11:11:52.380 回答
1

您正在调用这段代码:

Bitmap mIcon_val = BitmapFactory.decodeStream(newurl .openConnection().getInputStream());

在您的 onPostExecute 中。这意味着代码再次在主线程上执行,导致您的NetworkOnMainThread exception. 将图像保存到 中的变量中doInBackground,并将图像设置为ImageView中的onPostCreate

于 2013-05-28T11:11:55.843 回答
1

这些代码里面onPostExecute(String result)

        Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
                .openConnection().getInputStream());
        userphoto.setImageBitmap(mIcon_val);

在主线程中执行,将代码移入doInBackground,或尝试为上述代码再创建一个 AsyncTask,并在第一个 Asynctask 上运行新的 AsyncTask onPostExecute(String result)^^

于 2013-05-28T11:12:47.637 回答
0

谷歌在 Android 3.0 中添加了 NetworkOnMainThreadException 我相信这是为了迫使开发人员遵守不在 UI 线程上运行网络操作的最佳实践,因为它会冻结应用程序,这就是它在 2.X 而不是 4.X 上工作正常的原因。

将所有网络操作移至 doInBackground 中,然后按照其他人的建议仅在 onPostExecute 中设置图像。

于 2013-05-28T11:29:47.207 回答