为什么我用AsyncTask获取android.os.NetworkOnMainThreadException?

Jun*_*ned 7 android android-asynctask networkonmainthread

我在AsynkTask中编写了网络操作代码时得到了android.os.NetworkOnMainThreadException.抛出这个例外有什么其他原因吗?

这是我的代码:

public class Background_confirmation extends AsyncTask<Void, Integer, Void> {
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            progressDialog = ProgressDialog.show(Confirmation.this,
                    "Please wait...", "Retrieving data ...", true);
            try {
                HttpClient httpclient = new DefaultHttpClient();

                HttpPost httppost = new HttpPost(
                        "http://68.121.167.160/sip_chat_api/create_account.php?useralias="
                                + useralias + "&cntname=" + cntcode + "");
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                    is = entity.getContent();


            } catch (Exception e) {
                e.printStackTrace();
            }
            if (backgroung_flag == 1) {

            } else {
                if (is != null) {
                    try {
                        BufferedReader reader = new BufferedReader(
                                new InputStreamReader(is, "UTF-8"));
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line + "\n");
                        }
                        is.close();

                        result = sb.toString();
                    } catch (Exception e) {
                        Log.e("log_tag",
                                "Error converting result " + e.toString());
                    }
                }

            }
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            if (progressDialog.isShowing()) {
                progressDialog.dismiss();
                // progressDialog.setCancelable(true);
            }
            super.onPostExecute(result);
        }

    }
Run Code Online (Sandbox Code Playgroud)

我在OnCreate()中调用此类

new Background_confirmation().execute();
Run Code Online (Sandbox Code Playgroud)

但它总是在Catch块中,并给我这个例外LogCat
任何建议和想法将被赞赏.
谢谢

san*_*tar 5

您使用了错误的 AsyncTask 方法来放置与网络相关的代码。请把它移到doInBackground,因为onPreExecute发生在主线程上。于是,异常发生了。详细信息在这里


Anu*_*shA 4

public class Background_confirmation extends AsyncTask<Void, Integer, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            progressDialog = ProgressDialog.show(Confirmation.this, "Please wait...", "Retrieving data ...", true);

        }

        @Override
        protected String doInBackground(Void... params) {

            try {
                HttpClient httpclient = new DefaultHttpClient();

                HttpPost httppost = new HttpPost("http://68.121.167.160/sip_chat_api/create_account.php?useralias=" + useralias + "&cntname=" + cntcode + "");
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();

            } catch (Exception e) {
                e.printStackTrace();
            }
            if (backgroung_flag == 1) {

            } else {
                if (is != null) {
                    try {
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line + "\n");
                        }
                        is.close();

                        result = sb.toString();
                    } catch (Exception e) {
                        Log.e("log_tag", "Error converting result " + e.toString());
                    }
                }
            }
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            if (progressDialog.isShowing()) {
                progressDialog.dismiss();
                // progressDialog.setCancelable(true);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

你的代码应该像上面那样改变。你必须考虑的事情

  • 连接性应该在内部编码doInBackground()
  • 如果你想得到结果doInBackground(),你必须接受它onPostExecute()
  • 这意味着您必须返回一个字符串值,其中doInBackground()类的第三个参数AsyncTask也应该是字符串(这不在韦恩的答案中)

在您的代码中,您正在调用一个InputStream除了“else”部分之外我们看不到的函数。如果您只使用那个InputStream,请确保代码始终到达 else 部分。