android.osnetworkonmainthreadexception即使我有AsyncTask

时间:2013-10-04 10:20:47

标签: android http networking android-asynctask

我已经按照本教程实现了crud php mysql android应用程序 但当我执行android项目时,我点击了产品列表中的一个项目 我有这个错误:

android.osNetworkOnMainthreadException 

这里是asynctask doinbackground:

 protected String doInBackground(String... params) {

        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                // Check for success tag
                int success;
                try {
                    // Building Parameters
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("pid", pid));

                    // getting product details by making HTTP request
                    // Note that product details url will use GET request
                    JSONObject json = jsonParser.makeHttpRequest(
                            url_product_detials, "GET", params);

                    // check your log for json response
                    Log.d("Single Product Details", json.toString());

                    // json success tag
                    success = json.getInt(TAG_SUCCESS);
                    if (success == 1) {
                        // successfully received product details
                        JSONArray productObj = json
                                .getJSONArray(TAG_PRODUCT); // JSON Array

                        // get first product object from JSON Array
                        JSONObject product = productObj.getJSONObject(0);

                        // product with this pid found
                        // Edit Text
                        txtName = (EditText) findViewById(R.id.inputName);
                        txtPrice = (EditText) findViewById(R.id.inputPrice);
                        txtDesc = (EditText) findViewById(R.id.inputDesc);

                        // display product data in EditText
                        txtName.setText(product.getString(TAG_NAME));
                        txtPrice.setText(product.getString(TAG_PRICE));
                        txtDesc.setText(product.getString(TAG_DESCRIPTION));

                    }else{
                        // product with pid not found
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });

        return null;
    }

我删除了runOnUithread,但它产生了另一个错误

如何解决此问题

3 个答案:

答案 0 :(得分:1)

删除runOnUiThread。

删除此代码:

                    txtName = (EditText) findViewById(R.id.inputName);
                    txtPrice = (EditText) findViewById(R.id.inputPrice);
                    txtDesc = (EditText) findViewById(R.id.inputDesc);

                    // display product data in EditText
                    txtName.setText(product.getString(TAG_NAME));
                    txtPrice.setText(product.getString(TAG_PRICE));
                    txtDesc.setText(product.getString(TAG_DESCRIPTION));

并将其添加到onPostExecute,但您必须编辑asynctask以返回对象product并在onPostExecute中使用它。

一个非常快速的解决方案是将上面提到的代码放在runOnUiThread中。

答案 1 :(得分:0)

您不需要在doInBackground()内执行runOnUiThread,因为您只需要显示产品详细信息,您可以在onPostExecute()内直接执行此操作。

尝试以下步骤:

  1. doInBackground()返回产品JSONObject。
  2. 在onPostExecute()中获取JSONObject,并从中获取您想要的任何详细信息。现在,您可以在onPostExecute()
  3. 中编写用于显示和更新UI代码的代码
     txtName.setText(product.getString(TAG_NAME));
     txtPrice.setText(product.getString(TAG_PRICE));
     txtDesc.setText(product.getString(TAG_DESCRIPTION));
    

答案 2 :(得分:0)

分开你的工作。

  1. 从doInbackground中删除runOnUiThread并让它生成httpRequest并解析响应并返回响应。
  2. 使用onPostExecute根据响应更新ui。