-1

我已经按照本教程实现了 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 但它给我带来了另一个错误

如何解决这个问题

4

3 回答 3

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,但您必须编辑异步任务以返回对象product并在 onPostExecute 中使用它。

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

于 2013-10-04T10:22:59.653 回答
0

你不需要在里面做 runOnUiThreaddoInBackground()因为你只需要显示产品详细信息,你可以直接在里面做onPostExecute()

尝试以下步骤:

  1. 从 . 返回产品 JSONObject doInBackground()
  2. 在 onPostExecute() 中获取 JSONObject 并从中获取您想要的任何详细信息。现在您可以在此处编写用于显示和更新 UI 代码的代码onPostExecute()
 txtName.setText(product.getString(TAG_NAME));
 txtPrice.setText(product.getString(TAG_PRICE));
 txtDesc.setText(product.getString(TAG_DESCRIPTION));
于 2013-10-04T10:28:50.343 回答
0

把你的工作分开。

  1. 从 doInbackground 中删除 runOnUiThread 并让它发出 httpRequest 并解析响应并返回响应。
  2. 使用 onPostExecute 根据响应更新用户界面。
于 2013-10-04T10:31:21.100 回答