donglikuang8145 2015-12-03 10:57
浏览 77

无法获取值的详细信息

I'm new to a android programming and I'm running a program in android using eclipse, where i'm trying to fetch the details of the objects from the database so that i can edit and save changes. No wonder why program stops automatically while i click on the object displayed in my emulator. Below is the code. Please help me out!

 **Edit Product Activity** 

    package com.example.androidhives;

    import java.util.ArrayList;
    import java.util.List;

    import org.apache.http.NameValuePair;
    import org.apache.http.message.BasicNameValuePair;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;

    public class EditProductActivity extends Activity {

        EditText txtName;
        EditText txtPrice;
        EditText txtDesc;
        EditText txtCreatedAt;
        Button btnSave;
        Button btnDelete;

        String pid;

        // Progress Dialog
        private ProgressDialog pDialog;

        // JSON parser class
        JSONParser jsonParser = new JSONParser();

        // single product url
        private static final String url_product_details = "http://10.0.2.2/android/get_product_detail.php";

        // url to update product
        private static final String url_update_product = "http://10.0.2.2/android/update_product.php";

        // url to delete product
        private static final String url_delete_product = "http://10.0.2.2/android/delete_product.php";

        // JSON Node names
        private static final String TAG_SUCCESS = "success";
        private static final String TAG_PRODUCT = "product";
        private static final String TAG_PID = "pid";
        private static final String TAG_NAME = "name";
        private static final String TAG_PRICE = "price";
        private static final String TAG_DESCRIPTION = "description";

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.edit_product);

            // save button
            btnSave = (Button) findViewById(R.id.btnSave);
            btnDelete = (Button) findViewById(R.id.btnDelete);

            // getting product details from intent
            Intent i = getIntent();

            // getting product id (pid) from intent
            pid = i.getStringExtra(TAG_PID);

            // Getting complete product details in background thread
            new GetProductDetails().execute();

            // save button click event
            btnSave.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    // starting background task to update product
                    new SaveProductDetails().execute();
                }
            });

            // Delete button click event
            btnDelete.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    // deleting product in background thread
                    new DeleteProduct().execute();
                }
            });

        }

        /**
         * Background Async Task to Get complete product details
         * */
        class GetProductDetails extends AsyncTask<String, String, String> {

            /**
             * Before starting background thread Show Progress Dialog
             * */
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                pDialog = new ProgressDialog(EditProductActivity.this);
                pDialog.setMessage("Loading product details. Please wait...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(true);
                pDialog.show();
            }

            /**
             * Getting product details in background thread
             * */
            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_details, "GET", params);

                            // check your log for json response
                            Log.e("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;
            }

            /**
             * After completing background task Dismiss the progress dialog
             * **/
            protected void onPostExecute(String file_url) {
                // dismiss the dialog once got all details
                pDialog.dismiss();
            }
        }

        /**
         * Background Async Task to  Save product Details
         * */
        class SaveProductDetails extends AsyncTask<String, String, String> {

            /**
             * Before starting background thread Show Progress Dialog
             * */
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                pDialog = new ProgressDialog(EditProductActivity.this);
                pDialog.setMessage("Saving product ...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(true);
                pDialog.show();
            }

            /**
             * Saving product
             * */
            protected String doInBackground(String... args) {

                // getting updated data from EditTexts
                String name = txtName.getText().toString();
                String price = txtPrice.getText().toString();
                String description = txtDesc.getText().toString();

                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair(TAG_PID, pid));
                params.add(new BasicNameValuePair(TAG_NAME, name));
                params.add(new BasicNameValuePair(TAG_PRICE, price));
                params.add(new BasicNameValuePair(TAG_DESCRIPTION, description));

                // sending modified data through http request
                // Notice that update product url accepts POST method
                JSONObject json = jsonParser.makeHttpRequest(url_update_product,
                        "POST", params);

                // check json success tag
                try {
                    int success = json.getInt(TAG_SUCCESS);

                    if (success == 1) {
                        // successfully updated
                        Intent i = getIntent();
                        // send result code 100 to notify about product update
                        setResult(100, i);
                        finish();
                    } else {
                        // failed to update product
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                return null;
            }

            /**
             * After completing background task Dismiss the progress dialog
             * **/
            protected void onPostExecute(String file_url) {
                // dismiss the dialog once product uupdated
                pDialog.dismiss();
            }
        }

        /*****************************************************************
         * Background Async Task to Delete Product
         * */
        class DeleteProduct extends AsyncTask<String, String, String> {

            /**
             * Before starting background thread Show Progress Dialog
             * */
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                pDialog = new ProgressDialog(EditProductActivity.this);
                pDialog.setMessage("Deleting Product...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(true);
                pDialog.show();
            }

            /**
             * Deleting product
             * */
            protected String doInBackground(String... args) {

                // 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
                    JSONObject json = jsonParser.makeHttpRequest(
                            url_delete_product, "POST", params);

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

                    // json success tag
                    success = json.getInt(TAG_SUCCESS);
                    if (success == 1) {
                        // product successfully deleted
                        // notify previous activity by sending code 100
                        Intent i = getIntent();
                        // send result code 100 to notify about product deletion
                        setResult(100, i);
                        finish();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                return null;
            }

            /**
             * After completing background task Dismiss the progress dialog
             * **/
            protected void onPostExecute(String file_url) {
                // dismiss the dialog once product deleted
                pDialog.dismiss();

            }

        }
    }


    **JSONParser**

    package com.example.androidhives;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.util.List;

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.utils.URLEncodedUtils;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.JSONException;
    import org.json.JSONObject;

    import android.util.Log;

    public class JSONParser {

        static InputStream is = null;
        static JSONObject jObj = null;
        static String json = "";

        // constructor
        public JSONParser() {

        }

        // function get json from url
        // by making HTTP POST or GET mehtod
        public JSONObject makeHttpRequest(String url, String method,
                List<NameValuePair> params) {

            // Making HTTP request
            try {

                // check for request method
                if(method == "POST"){
                    // request method is POST
                    // defaultHttpClient
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    HttpPost httpPost = new HttpPost(url);
                    httpPost.setEntity(new UrlEncodedFormEntity(params));

                    HttpResponse httpResponse = httpClient.execute(httpPost);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    is = httpEntity.getContent();

                }else if(method == "GET"){
                    // request method is GET
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    String paramString = URLEncodedUtils.format(params, "utf-8");
                    url += "?" + paramString;
                    HttpGet httpGet = new HttpGet(url);

                    HttpResponse httpResponse = httpClient.execute(httpGet);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    is = httpEntity.getContent();
                }           

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        is, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "
");
                }
                is.close();
                json = sb.toString();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }

            // try parse the string to a JSON object
            try {
                jObj = new JSONObject(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }

            // return JSON String
            return jObj;

        }
    }

    **PHP File**


    <?php

    $response=array();

    require_once('db_connect.php');

    $db=new DB_CONNECT();
    $db->construct();
    $db->connect();




    if(isset($_GET['pid']))
    {
        $pid=$_GET['pid'];

        $result=mysql_query("Select * from products where pid='$pid'");

        if(!empty($result))
        {
            if(mysql_num_rows($result)>0)
            {
                $result=mysql_fetch_array($result);

                $product=array();
                $product["pid"]=$response["pid"];
                $product["name"]=$response["name"];
                $product["price"]=$response["price"];
                $product["description"]=$response["description"];
                $product["created_at"]=$response["created_at"];
                $product["updated_at"]=$response["updated_at"];

                $response["product"]=array();

                array_push($response["product"],$product);

                echo json_encode($response);
            }
            else
            {
                $response["success"]=0;
                $response["message"]="No product found.";

                echo json_encode($response);
            }
    }
        else
            {
                $response["success"]=0;
                $response["message"]="No product found.";

                echo json_encode($response);
            }
    }
    else
    {
        $response["success"]=0;
        $response["message"]="Required fields missing.";

        echo json_encode($response);
    }




    ?>
  • 写回答

1条回答 默认 最新

  • dongxia026531 2015-12-03 11:12
    关注

    Your GetProductDetails AsyncTask does Network Calls on the UI Thread

            /**
             * Getting product details in background thread
             * */
            protected String doInBackground(String... params) {
    
                // updating UI from Background Thread
                runOnUiThread(new Runnable() {
    ...
    

    You should think about why you want to use an Asynctask if all it does is doing something on the UI Thread. If you need to change your User Interface, do it in onPostExecute().

    If changing your Asynctask doesn't help, consider adding more information about the error you got (e.g. logs)

    评论

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c