0

I am a VB'er (VB Developer). I decided to give Android/Java a go. Well, so far it hasn't been going so good. I seem to run in circles with Android. I bought some books, did some tutorials, etc. Still, I always find myself in a loop of confusion when it comes to Android. I have been attempting to manually assign a string a value and then press a button and send that value "pid" to a php script, have it retrieve the response and populate a ListView. I can get it to work by creating a php script for every pid but I was trying to create one script, send the value and retrieve everything that matched in a test DB. FYI, I am also not very familiar with PHP but it seems pretty easy.

HERE IS MY MAINACTIVITY:

import java.util.ArrayList;
import java.util.HashMap;
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.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {
     String pid; 

        // Progress Dialog 
        private ProgressDialog MyDialog; 

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

        // Product URL
        private static final String url_product_detials = "http://xxx.xxx.xxx.xxx/phpTest.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";
        JSONArray products = null;
        ArrayList<HashMap<String, String>> getSpecificList;
        ListView list;
        Button MyButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Assign pid generic value from test DB.
           pid = "dfdf";
           list = (ListView)findViewById(R.id.listView1);
           MyButton = (Button)findViewById(R.id.button1);

           MyButton.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new GetProductDetails().execute();
            }

           });
    }
     class GetProductDetails extends AsyncTask<String, String, String> { 

            /** 
             * Before starting background thread Show Progress Dialog 
             * */
            @Override
            protected void onPreExecute() { 
                super.onPreExecute(); 
                MyDialog = new ProgressDialog(MainActivity.this); 
                MyDialog.setMessage("Loading Products. Please wait..."); 
                MyDialog.setIndeterminate(false); 
                MyDialog.setCancelable(true); 
                MyDialog.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_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 
                                products = json.getJSONArray(TAG_PRODUCT); 

                                for (int i = 0; i < products.length(); i++) {
                                    JSONObject c = products.getJSONObject(i);

                                    // Storing JSON Items
                                    String id = c.getString(TAG_PID);
                            String name = c.getString(TAG_NAME);
                                    String updated_at = c.getString(TAG_PRICE);

                                    //HashMap
                                    HashMap<String, String> map = new HashMap<String, String>();

                                    // adding each child node to HashMap key => value
                                    map.put(TAG_PID, id);
                                    map.put(TAG_NAME, name);
                                    map.put(TAG_PRICE, updated_at);
                                    // adding HashList to ArrayList
                                    getSpecificList.add(map);
                                }


                            }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 dialog 
                MyDialog.dismiss();
                // updating UI from Background Thread
                runOnUiThread(new Runnable() {
                    public void run() {

                ListAdapter adapter = new SimpleAdapter(MainActivity.this, getSpecificList,R.layout.list_item, new String[] { TAG_PID,TAG_NAME},new int[] { R.id.pid, R.id.name2 });
                list.setAdapter(adapter);
                    }

                });
            }
        }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

Below is the PHP

<?php 

// array for JSON response 
$response = array(); 

// include db connect class 
require_once __DIR__ . '/db_connect.php'; 

// connecting to db 
$db = new DB_CONNECT(); 

// check for post data 
if (isset($_GET["pid"])) { 
    $pid = $_GET['pid']; 

    // get and item from the table products in the column PRICE that is equal to pid
    $result = mysql_query("SELECT *FROM products WHERE price LIKE $pid"); 

    if (!empty($result)) { 
        // check to see if there is a result
        if (mysql_num_rows($result) > 0) { 

            $result = mysql_fetch_array($result); 

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

            // user node 
            $response["product"] = array(); 

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

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

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

        // echo no users JSON 
        echo json_encode($response); 
    } 
} else { 
    // required field is missing 
    $response["success"] = 0; 
    $response["message"] = "Required field(s) is missing"; 

    // echoing JSON response 
    echo json_encode($response); 
} 
?>

Here is the LogCat Output:

06-18 08:03:36.415: W/dalvikvm(19438): threadid=1: thread exiting with uncaught exception (group=0x41e422a0)
06-18 08:03:36.415: E/AndroidRuntime(19438): FATAL EXCEPTION: main
06-18 08:03:36.415: E/AndroidRuntime(19438): android.os.NetworkOnMainThreadException
06-18 08:03:36.415: E/AndroidRuntime(19438):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at libcore.io.IoBridge.connect(IoBridge.java:112)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at java.net.Socket.connect(Socket.java:842)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at com.example.php_sql_listview.JSONParser.makeHttpRequest(JSONParser.java:62)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at com.example.php_sql_listview.MainActivity$GetProductDetails$1.run(MainActivity.java:99)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at android.os.Handler.handleCallback(Handler.java:615)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at android.os.Handler.dispatchMessage(Handler.java:92)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at android.os.Looper.loop(Looper.java:137)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at android.app.ActivityThread.main(ActivityThread.java:4898)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at java.lang.reflect.Method.invokeNative(Native Method)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at java.lang.reflect.Method.invoke(Method.java:511)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
06-18 08:03:36.415: E/AndroidRuntime(19438):    at dalvik.system.NativeStart.main(Native Method)

I did notice the Fatal Thread error so I tried removing the below but I got the same error.

runOnUiThread(new Runnable() {
public void run() {

Thanks for your help. I do appreciate it. I try for a week or two before I bother you guys with something that may be simple. I have 7 books on Java and Android Dev. but not a single one talks about GSON, JSON, or really anything other than small notes on SQLite. Anyways, thanks again.

LogCat Output after suggestions:

06-18 09:07:09.160: E/AndroidRuntime(26519): FATAL EXCEPTION: main
06-18 09:07:09.160: E/AndroidRuntime(26519): android.os.NetworkOnMainThreadException
06-18 09:07:09.160: E/AndroidRuntime(26519):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at libcore.io.IoBridge.connect(IoBridge.java:112)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at java.net.Socket.connect(Socket.java:842)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at com.example.php_sql_listview.JSONParser.makeHttpRequest(JSONParser.java:62)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at com.example.php_sql_listview.MainActivity$GetProductDetails$1.run(MainActivity.java:99)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at android.os.Handler.handleCallback(Handler.java:615)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at android.os.Handler.dispatchMessage(Handler.java:92)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at android.os.Looper.loop(Looper.java:137)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at android.app.ActivityThread.main(ActivityThread.java:4898)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at java.lang.reflect.Method.invokeNative(Native Method)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at java.lang.reflect.Method.invoke(Method.java:511)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
06-18 09:07:09.160: E/AndroidRuntime(26519):    at dalvik.system.NativeStart.main(Native Method)

I had already tried removing what has been suggested. See above. Thanks.

Changes to Code:

 class GetProductDetails extends AsyncTask<String, String, String> { 

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

            /** 
             * Getting product details in background thread 
             * */
            protected String doInBackground(String... args) { 

                // updating UI from Background Thread 
                List<NameValuePair> params = new ArrayList<NameValuePair>(); 
                params.add(new BasicNameValuePair("pid", pid)); 
                JSONObject json = jsonParser.makeHttpRequest(url_product_detials, "GET", params); 
                // check your log for json response 
                Log.d("Single Product Details", json.toString()); 

                        // Check for success tag 

                        try { 

                            // json success tag 
                             int success = json.getInt(TAG_SUCCESS); 
                            if (success == 1) { 
                                // successfully received product details 
                                products = json.getJSONArray(TAG_PRODUCT); 

                                for (int i = 0; i < products.length(); i++) {
                                    JSONObject c = products.getJSONObject(i);

                                    // Storing JSON Items
                                    String id = c.getString(TAG_PID);
                            String name = c.getString(TAG_NAME);
                                    String updated_at = c.getString(TAG_PRICE);

                                    //HashMap
                                    HashMap<String, String> map = new HashMap<String, String>();

                                    // adding each child node to HashMap key => value
                                    map.put(TAG_PID, id);
                                    map.put(TAG_NAME, name);
                                    map.put(TAG_PRICE, updated_at);
                                    // adding HashList to ArrayList
                                    getSpecificList.add(map);
                                }


                            }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 dialog 
                MyDialog.dismiss();

                ListAdapter adapter = new SimpleAdapter(MainActivity.this, getSpecificList,R.layout.list_item, new String[] { TAG_PID,TAG_NAME},new int[] { R.id.pid, R.id.name2 });
                list.setAdapter(adapter);
                    }
        }

Still getting a Thread Exception: LogCat 6/19/2013:

06-19 15:11:04.599: D/Single Product Details(27108): {"product":[{"created_at":"svsvsvsv","pid":"dfdf","updated_at":"http:\/\/xxx.xxx.xxx.xxx\/img\/8Cell.jpg","price":"MYPRICE","description":"","name":"dfdf"}],"success":1}
06-19 15:11:04.604: W/System.err(27108): org.json.JSONException: No value for products
06-19 15:11:04.604: W/System.err(27108):    at org.json.JSONObject.get(JSONObject.java:354)
06-19 15:11:04.604: W/System.err(27108):    at org.json.JSONObject.getJSONArray(JSONObject.java:544)
06-19 15:11:04.604: W/System.err(27108):    at com.example.php_sql_listview.MainActivity$LoadAllProducts.doInBackground(MainActivity.java:105)
06-19 15:11:04.604: W/System.err(27108):    at com.example.php_sql_listview.MainActivity$LoadAllProducts.doInBackground(MainActivity.java:1)
06-19 15:11:04.604: W/System.err(27108):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-19 15:11:04.604: W/System.err(27108):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-19 15:11:04.604: W/System.err(27108):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-19 15:11:04.604: W/System.err(27108):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-19 15:11:04.604: W/System.err(27108):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
06-19 15:11:04.604: W/System.err(27108):    at java.lang.Thread.run(Thread.java:856)
06-19 15:11:04.609: D/AndroidRuntime(27108): Shutting down VM
06-19 15:11:04.609: W/dalvikvm(27108): threadid=1: thread exiting with uncaught exception (group=0x41e422a0)
06-19 15:11:04.619: D/dalvikvm(27108): GC_CONCURRENT freed 192K, 6% free 12401K/13127K, paused 12ms+12ms, total 41ms
06-19 15:11:04.624: E/AndroidRuntime(27108): FATAL EXCEPTION: main
06-19 15:11:04.624: E/AndroidRuntime(27108): java.lang.NullPointerException
06-19 15:11:04.624: E/AndroidRuntime(27108):    at android.widget.SimpleAdapter.getCount(SimpleAdapter.java:93)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at android.widget.ListView.setAdapter(ListView.java:466)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at com.example.php_sql_listview.MainActivity$LoadAllProducts.onPostExecute(MainActivity.java:147)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at com.example.php_sql_listview.MainActivity$LoadAllProducts.onPostExecute(MainActivity.java:1)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at android.os.AsyncTask.finish(AsyncTask.java:631)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at android.os.Looper.loop(Looper.java:137)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at android.app.ActivityThread.main(ActivityThread.java:4898)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at java.lang.reflect.Method.invokeNative(Native Method)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at java.lang.reflect.Method.invoke(Method.java:511)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
06-19 15:11:04.624: E/AndroidRuntime(27108):    at dalvik.system.NativeStart.main(Native Method)
4

3 回答 3

2

问题是您试图在主线程中使用 HTTP 连接。这可能会导致 ANR 问题。您明智地使用了 AsyncTask,但您使用它的方式不正确。首先 doInBackgorund 用于以不停止主线程的方式执行“繁重”任务。但是,如果您运行 OnUIThread 繁重的过程,那么您就无法使用 AsyncTask。在 onPostExecute 方法中,您应该更新 ui。在这种情况下 runOnUIThread 是无用的,因为它已经在主线程中运行。所以 1. 删除 doInBackground 中的 runOnUIThread 2. 删除 onPostExecute 中的 runOnUIThread

于 2013-06-18T13:50:36.030 回答
0

This exception is thrown when an application attempts to perform a networking operation on its main thread. Run your code in AsyncTask..... in your code runOnUiThread in post execute is where the problem is...

于 2013-06-18T13:11:48.937 回答
0

从 onPostExecute 方法中删除以下代码:

runOnUiThread(new Runnable() {
                    public void run() {
                      }
                }

并把你的列表视图适配器线:

ListAdapter adapter = new SimpleAdapter(MainActivity.this, getSpecificList,R.layout.list_item, new String[] { TAG_PID,TAG_NAME},new int[] { R.id.pid, R.id.name2 });
list.setAdapter(adapter);

照原样。

于 2013-06-18T13:17:41.743 回答