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)