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



我在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);
        }
    }

我在OnCreate()中调用这个类

new Background_confirmation().execute();

但它总是进入Catch块,并给我这个例外LogCat
任何建议和想法都将不胜感激
感谢

您使用了错误的AsyncTask方法来放置与网络相关的代码。请将其移动到doInBackground,因为onPreExecute发生在主线程上。所以,出现了异常。详情在这里。

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);
            }
        }
    }

您的代码应该如上所述进行更改。需要考虑的事项

  • 连接应编码在doInBackground()
  • 如果你想得到doInBackground()的结果,你必须把它放在onPostExecute()
  • 这意味着您必须在doInBackground()中返回一个String值,其中AsyncTask类的第三个参数也应该是String(这不是Wayne的答案)

在您的代码中,您正在调用一个InputStream,除非在"else"部分,否则我们看不到它。如果您只使用InputStream,请确保代码始终到达其他部分。

将所有网络请求代码放入doInBackground中。onPreExecuteonPostExecute将在UI线程(main thead)上运行,因此如果您在这两个方法上请求网络,您将获得一个exeption。

public class Background_confirmation extends AsyncTask<Void, Integer, Void> {
    @Override
    protected void onPreExecute() {            
        progressDialog = ProgressDialog.show(Confirmation.this,
                "Please wait...", "Retrieving data ...", true);            
    }
    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        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());
                }
            }
        }
    }
    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        if (progressDialog.isShowing()) {
            progressDialog.dismiss();
            // progressDialog.setCancelable(true);
        }
    }
}

最新更新