-1

I am trying to parse a JSON format in my Android Application. I am fairly new in developing android applications so I am referring to a lot of tutorials. I followed the steps in this tutorial : http://mobilesiri.com/json-parsing-in-android-using-android-studio/

Here is my MainActivity.java class :

package com.example.carlajoyce.parsejson;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListAdapter;
import android.widget.SimpleAdapter;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends ListActivity {

private static String url = "http://tech.ccare.jrhernani.com/tech/workorders";
private static final String TAG_WORKORDERINFO = "workorders";
private static final String TAG_ID = "id";
private static final String TAG_SUBJECT = "subject";
private static final String TAG_DESCRIPTION = "description";
private static final String TAG_INITIATED = "initiated";
private static final String TAG_FINISHED = "finished";
private static final String TAG_CREATEDAT = "created_at";
private static final String TAG_UPDATEDAT = "updated_at";
private static final String TAG_TICKETID = "ticket_id";
private static final String TAG_CREATEDBYID = "createdBy_id";
private static final String TAG_TECHNICIANID = "technician_id";
private static final String TAG_WORKORDERREFID = "workorderref_id";
private static final String TAG_WORKORDERSTATUSID = "workorderstatus_id";
private static final String TAG_DEPARTMENTID = "department_id";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new GetWorkOrders().execute();
}

/**
 *Async task class to get JSON by making HTTP call
 */
private class GetWorkOrders extends AsyncTask<Void, Void, Void> {

    /*HashMap for ListView*/
    ArrayList<HashMap<String, String>> workOrderList;
    ProgressDialog pDialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        /*Creating service handler class instance*/
        WebRequest webreq = new WebRequest();

        /* Making a request to url and getting response*/

        String jsonStr = webreq.makeWebServiceCall(url, WebRequest.GETRequest);

        Log.d("Response: ", "> " + jsonStr);

        workOrderList = ParseJSON(jsonStr);

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        /*Dismiss the progress dialog*/
        if (pDialog.isShowing())
            pDialog.dismiss();
        /**
         * Updating parsed JSON data into ListView
         * */
        ListAdapter adapter = new SimpleAdapter(
                MainActivity.this, workOrderList,
                R.layout.list_item, new String[]{TAG_SUBJECT, TAG_DESCRIPTION}, new int[]{R.id.subject, R.id.description});

        setListAdapter(adapter);
    }
}

private ArrayList<HashMap<String, String>> ParseJSON(String json) {
    if (json != null) {
        try {
            // Hashmap for ListView
            ArrayList<HashMap<String, String>> workOrderList = new ArrayList<HashMap<String, String>>();

            JSONObject jsonObj = new JSONObject(json);

            // Getting JSON Array node
            JSONArray workOrders = jsonObj.getJSONArray(TAG_WORKORDERINFO);

            // looping through All WorkOrders
            for (int i = 0; i < workOrders.length(); i++) {
                JSONObject c = workOrders.getJSONObject(i);

                String id = c.getString(TAG_ID);
                String subject = c.getString(TAG_SUBJECT);
                String description = c.getString(TAG_DESCRIPTION);
                String initiated = c.getString(TAG_INITIATED);
                String finished = c.getString(TAG_FINISHED);
                String created_at = c.getString(TAG_CREATEDAT);
                String updated_at = c.getString(TAG_UPDATEDAT);
                String ticket_id = c.getString(TAG_TICKETID);
                String createdBy_id = c.getString(TAG_CREATEDBYID);
                String technician_id = c.getString(TAG_TECHNICIANID);
                String workorderref_id = c.getString(TAG_WORKORDERREFID);
                String workorderstatus_id = c.getString(TAG_WORKORDERSTATUSID);
                String department_id = c.getString(TAG_DEPARTMENTID);


                // tmp hashmap for single student
                HashMap<String, String> workOrder = new HashMap<String, String>();

                // adding each child node to HashMap key => value
                workOrder.put(TAG_ID,id);
                workOrder.put(TAG_SUBJECT, subject);
                workOrder.put(TAG_DESCRIPTION, description);
                workOrder.put(TAG_INITIATED, initiated);
                workOrder.put(TAG_FINISHED, finished);
                workOrder.put(TAG_CREATEDAT, created_at);
                workOrder.put(TAG_UPDATEDAT, updated_at);
                workOrder.put(TAG_TICKETID, ticket_id);
                workOrder.put(TAG_CREATEDBYID, createdBy_id);
                workOrder.put(TAG_TECHNICIANID, technician_id);
                workOrder.put(TAG_WORKORDERREFID, workorderref_id);
                workOrder.put(TAG_WORKORDERSTATUSID, workorderstatus_id);
                workOrder.put(TAG_DEPARTMENTID, department_id);

                // adding student to students list
                workOrderList.add(workOrder);
            }
            return workOrderList;
        } catch (JSONException e) {
            e.printStackTrace();
            return null;
        }
    } else {
        Log.e("ServiceHandler", "Couldn't get any data from the url.");
        return null;
    }
}



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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

}

I have a basic understanding of how the code works and I fixed some problems that occurred without having to ask here but I met a problem on I don't know where to begin. I am hoping you can tell me the reason for these errors:

02-16 17:51:31.294    6378-6378/com.example.carlajoyce.parsejson E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.carlajoyce.parsejson, PID: 6378
java.lang.NullPointerException
        at android.widget.SimpleAdapter.getCount(SimpleAdapter.java:93)
        at android.widget.ListView.setAdapter(ListView.java:480)
        at android.app.ListActivity.setListAdapter(ListActivity.java:265)
        at com.example.carlajoyce.parsejson.MainActivity$GetWorkOrders.onPostExecute(MainActivity.java:93)
        at com.example.carlajoyce.parsejson.MainActivity$GetWorkOrders.onPostExecute(MainActivity.java:49)
        at android.os.AsyncTask.finish(AsyncTask.java:632)
        at android.os.AsyncTask.access$600(AsyncTask.java:177)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:801)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:617)
        at dalvik.system.NativeStart.main(Native Method)

NOTE: I also downloaded the code the tutorial provided and it works just fine. Thanks in advance.

2 Answers2

0

I think you should first initialize adapter and view with empty list, so move this:

       ListAdapter adapter = new SimpleAdapter(
            MainActivity.this, workOrderList,
            R.layout.list_item, new String[]{TAG_SUBJECT, TAG_DESCRIPTION}, new int[]{R.id.subject, R.id.description}); 

       setListAdapter(adapter);

to onCreate() in MainActivity, and when job is finished - in onPostExecute() just notify adapter that data set changed.

       adapter.notifyDataSetChanged();

Please let me know if it works for you.

-1

It happens if the workOrderList is null.

You have to initialize this list before calling the constructor of your adapter.

 ListAdapter adapter = new SimpleAdapter(
                MainActivity.this, workOrderList,
                R.layout.list_item, new String[]{TAG_SUBJECT, TAG_DESCRIPTION}, new int[]{R.id.subject, R.id.description});

It happens because your ParseJSON (called in the doInBackground method) can return null

Gabriele Mariotti
  • 192,671
  • 57
  • 469
  • 489