Jan van Dijk
Jan van Dijk

Reputation: 105

Not getting Json to listview

I've been having this problem for some time now and I can't figure out why it doesn't get the JSON.. It should display the info from here... The app crashes with the following error, and I cant figure it out.. What does the error mean? DoInBackground error?

Error

11-04 14:21:27.437    1356-1541/me.janvandijk.receptenapp E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2
Process: me.janvandijk.receptenapp, PID: 1356
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:304)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.toString()' on a null object reference
        at me.janvandijk.receptenapp.Recept$retrievedata.doInBackground(Recept.java:62)
        at me.janvandijk.receptenapp.Recept$retrievedata.doInBackground(Recept.java:54)
        at android.os.AsyncTask$2.call(AsyncTask.java:292)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)

package me.janvandijk.receptenapp;


public class Recept extends Activity {

String receptid;
private ProgressDialog pDialog;
private static String url = "http://janvandijk.me/zooi/receptenapp/getrecipes.php?type=request&datatype=recept&id=";

ListView lv=(ListView)findViewById(R.id.receptList);

// JSON Node names
private static final String TAG_NAAM = "naam";
private static final String TAG_AUTEUR = "unaam";
private static final String TAG_BESCHRIJVING = "beschrijving";
private static final String TAG_INGREDIENTEN = "ingredienten";
private static final String TAG_BEREIDING = "bereiding";
private static final String TAG_RATING = "id";

// contacts JSONArray
JSONArray recept = null;

// Hashmap for ListView
ArrayList<HashMap<String, String>> receptList;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recept);
    //showToast();
    //new ReceptAsynTask().execute("http://janvandijk.me/zooi/receptenapp/getrecipes.php?type=request&datatype=recept&id=" + receptid);

    receptList = new ArrayList<HashMap<String, String>>();


    new GetRecept().execute();
}



private class GetRecept extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog
        pDialog = new ProgressDialog(Recept.this);
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);
        pDialog.show();

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        // Creating service handler class instance
        ServiceHandler sh = new ServiceHandler();

        // Making a request to url and getting response
        String finalurl = url+"1";
        String jsonStr = sh.makeServiceCall(finalurl, ServiceHandler.GET);

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

        if (jsonStr != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);

                // Getting JSON Array node
                recept = jsonObj.getJSONArray("0");

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

                    String naam = c.getString(TAG_NAAM);
                    String auteur = c.getString(TAG_AUTEUR);
                    String bereiding = c.getString(TAG_BEREIDING);
                    String beschrijving = c.getString(TAG_BESCHRIJVING);
                    String ingredienten = c.getString(TAG_INGREDIENTEN);
                    String rating = c.getString(TAG_RATING);



                    // tmp hashmap for single contact
                    HashMap<String, String> receptje = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    receptje.put(TAG_NAAM, naam);
                    receptje.put(TAG_AUTEUR, auteur);
                    receptje.put(TAG_BEREIDING, bereiding);
                    receptje.put(TAG_BESCHRIJVING, beschrijving);
                    receptje.put(TAG_INGREDIENTEN, ingredienten);
                    receptje.put(TAG_RATING, rating);


                    // adding contact to contact list
                    receptList.add(receptje);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");
        }

        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(
                Recept.this, receptList,
                R.layout.recept_item, new String[] { TAG_NAAM, TAG_AUTEUR,
                TAG_BEREIDING, TAG_INGREDIENTEN, TAG_BESCHRIJVING, TAG_RATING }, new int[] { R.id.receptTitel,
                R.id.receptAuteur, R.id.bereidingText, R.id.ingredientenText, R.id.beschrijvingText, R.id.receptRating });

        lv.setAdapter(adapter);

    }

}


public void setText(String string){
    //tv.setText(string);
}

public void showToast(){
    Toast.makeText(getApplicationContext(), "Bezig met laden recept met ID "+receptid, Toast.LENGTH_LONG).show();
}

@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_recept, menu);
    //TextView view = (TextView) findViewById(R.id.testje);
    //view.setText(receptid);
    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);
}

}

public class serviceHandler{


static String response = null;
public final static int GET = 1;
public final static int POST = 2;

public ServiceHandler() {

}

/**
 * Making service call
 * @url - url to make request
 * @method - http request method
 * */
public String makeServiceCall(String url, int method) {
    return this.makeServiceCall(url, method, null);
}

/**
 * Making service call
 * @url - url to make request
 * @method - http request method
 * @params - http request params
 * */
public String makeServiceCall(String url, int method,
                              List<NameValuePair> params) {
    try {
        // http client
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpEntity httpEntity = null;
        HttpResponse httpResponse = null;

        // Checking http request method type
        if (method == POST) {
            HttpPost httpPost = new HttpPost(url);
            // adding post params
            if (params != null) {
                httpPost.setEntity(new UrlEncodedFormEntity(params));
            }

            httpResponse = httpClient.execute(httpPost);

        } else if (method == GET) {
            // appending params to url
            if (params != null) {
                String paramString = URLEncodedUtils
                        .format(params, "utf-8");
                url += "?" + paramString;
            }
            HttpGet httpGet = new HttpGet(url);

            httpResponse = httpClient.execute(httpGet);

        }
        httpEntity = httpResponse.getEntity();
        response = EntityUtils.toString(httpEntity);

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

    return response;

}

}

NEW ERROR

    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
        at me.janvandijk.receptenapp.Recept$GetRecept.onPostExecute(Recept.java:147)
        at me.janvandijk.receptenapp.Recept$GetRecept.onPostExecute(Recept.java:63)
        at android.os.AsyncTask.finish(AsyncTask.java:636)
        at android.os.AsyncTask.access$500(AsyncTask.java:177)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Upvotes: 0

Views: 62

Answers (1)

JstnPwll
JstnPwll

Reputation: 8695

This important line in your stack trace is:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.toString()' on a null object reference


Second error:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference

This means the object you are calling setAdapter on (lv) is null:

lv.setAdapter(adapter);

You can't use findViewById before the Activity's layout has been inflated. That's why lv is null. You should change this line:

ListView lv=(ListView)findViewById(R.id.receptList);

... to this:

ListView lv;

... and add this to onCreate:

lv = (ListView)findViewById(R.id.receptList);

You should also read up on null object references, they are very common.

Upvotes: 2

Related Questions