0

I am trying to send data to Gsoap server using JSON object using android 4.0.3. I was run into a NetworkOnMainThread Exception with my android app. Then I have used network access is in an AsyncTask, so I don't see the point in this Exception anyway. But now I am getting Nullpointer Exception. I have posted code with error logcat. I have already google dint get proper solution. So please anyone say me where I am going wrong. I am trying first time with JSON to send data.... I can send data to server without using JSON.. but need to send with JSON..

it crashing at this line doInBack = (DownloadWebPageTask) doInBack.execute(new String[] { "192.168.1.40" });

Here is my code.. MainAcitivty i.e AndroidJSONParsingActivity

 public class AndroidJSONParsingActivity extends ListActivity {

// url to make request
// private static String url = "http://192.168.1.40";

// JSON Node names
private static final String TAG_CONTACTS = "contacts";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_ADDRESS = "address";
private static final String TAG_GENDER = "gender";
private static final String TAG_PHONE = "phone";
private static final String TAG_PHONE_MOBILE = "mobile";
private static final String TAG_PHONE_HOME = "home";
private static final String TAG_PHONE_OFFICE = "office";

// contacts JSONArray
JSONArray contacts = null;

private AsyncTask<String, Void, String> doInBack;

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

    // Hashmap for ListView
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

    // Creating JSON Parser instance
    JSONParser jParser = new JSONParser();

    doInBack = (DownloadWebPageTask) doInBack
            .execute(new String[] { "http://192.168.1.40" });
    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(doInBack);

    try {
        // Getting Array of Contacts
        contacts = json.getJSONArray(TAG_CONTACTS);

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

            // Storing each json item in variable
            String id = c.getString(TAG_ID);
            String name = c.getString(TAG_NAME);
            String email = c.getString(TAG_EMAIL);
            String address = c.getString(TAG_ADDRESS);
            String gender = c.getString(TAG_GENDER);

            // Phone number is agin JSON Object
            JSONObject phone = c.getJSONObject(TAG_PHONE);
            String mobile = phone.getString(TAG_PHONE_MOBILE);
            String home = phone.getString(TAG_PHONE_HOME);
            String office = phone.getString(TAG_PHONE_OFFICE);

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

            // adding each child node to HashMap key => value
            map.put(TAG_ID, id);
            map.put(TAG_NAME, name);
            map.put(TAG_EMAIL, email);
            map.put(TAG_PHONE_MOBILE, mobile);

            // adding HashList to ArrayList
            contactList.add(map);
        }
    } catch (JSONException e) {
        e.printStackTrace();
        System.out.println("JsonException--- " + e.getMessage());
    }

    /**
     * Updating parsed JSON data into ListView
     * */
    ListAdapter adapter = new SimpleAdapter(this, contactList,
            R.layout.list_item, new String[] { TAG_NAME, TAG_EMAIL,
                    TAG_PHONE_MOBILE }, new int[] { R.id.name, R.id.email,
                    R.id.mobile });

    setListAdapter(adapter);

    // selecting single ListView item
    ListView lv = getListView();

    // Launching new screen on Selecting Single ListItem
    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            String name = ((TextView) view.findViewById(R.id.name))
                    .getText().toString();
            String cost = ((TextView) view.findViewById(R.id.email))
                    .getText().toString();
            String description = ((TextView) view.findViewById(R.id.mobile))
                    .getText().toString();

            // Starting new intent
            Intent in = new Intent(getApplicationContext(),
                    SingleMenuItemActivity.class);
            in.putExtra(TAG_NAME, name);
            in.putExtra(TAG_EMAIL, cost);
            in.putExtra(TAG_PHONE_MOBILE, description);
            startActivity(in);

        }
    });

}

private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
        String response = "";
        for (String url : urls) {
            DefaultHttpClient client = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            try {
                HttpResponse execute = client.execute(httppost);
                InputStream content = execute.getEntity().getContent();

                BufferedReader buffer = new BufferedReader(
                        new InputStreamReader(content));
                String s = "";
                while ((s = buffer.readLine()) != null) {
                    response += s;
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return response;
    }

    @Override
    protected void onPostExecute(String result) {

    }
}

}

JsonParser.java class

public class JSONParser {

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

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        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 + "\n");
        }
        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;

}

public JSONObject getJSONFromUrl(AsyncTask<String, Void, String> doInBack) {
    // TODO Auto-generated method stub
    return null;
}
}

SingleMenuItemActivity.java class

public class SingleMenuItemActivity  extends Activity {

// JSON node keys
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_PHONE_MOBILE = "mobile";
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.single_list_item);

    // getting intent data
    Intent in = getIntent();

    // Get JSON values from previous intent
    String name = in.getStringExtra(TAG_NAME);
    String cost = in.getStringExtra(TAG_EMAIL);
    String description = in.getStringExtra(TAG_PHONE_MOBILE);

    // Displaying all values on the screen
    TextView lblName = (TextView) findViewById(R.id.name_label);
    TextView lblCost = (TextView) findViewById(R.id.email_label);
    TextView lblDesc = (TextView) findViewById(R.id.mobile_label);

    lblName.setText(name);
    lblCost.setText(cost);
    lblDesc.setText(description);
}
}

my logcat error report

 06-08 17:46:55.459: E/AndroidRuntime(2542): java.lang.RuntimeException: Unable to start activity           ComponentInfo{com.androidhive.jsonparsing/com.androidhive.jsonparsing.AndroidJSONParsingAct ivity}: java.lang.NullPointerException
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at android.app.ActivityThread.access$600(ActivityThread.java:123)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at android.os.Handler.dispatchMessage(Handler.java:99)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at android.os.Looper.loop(Looper.java:137)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at android.app.ActivityThread.main(ActivityThread.java:4424)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at java.lang.reflect.Method.invokeNative(Native Method)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at java.lang.reflect.Method.invoke(Method.java:511)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at dalvik.system.NativeStart.main(Native Method)
 06-08 17:46:55.459: E/AndroidRuntime(2542): Caused by: java.lang.NullPointerException
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at com.androidhive.jsonparsing.AndroidJSONParsingActivity.onCreate(AndroidJSONParsingActivity.java:62)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at android.app.Activity.performCreate(Activity.java:4465)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
 06-08 17:46:55.459: E/AndroidRuntime(2542):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)

Many Thanks..

4
  • Which one is AndroidJSONParsingActivity.java:62 line? Commented Jun 8, 2012 at 12:49
  • that line holds the server URL.. asyntask is in action.. Commented Jun 8, 2012 at 12:53
  • not working.. same error I am getting.. null pointer exception.. :( Commented Jun 8, 2012 at 13:08
  • crashing at this point doInBack = (DownloadWebPageTask) doInBack .execute(new String[] { "192.168.1.40" }); Commented Jun 8, 2012 at 13:18

1 Answer 1

1

Check if JsonObject "c" really includes those fields. Probably you will get the NullPointerException in one of the lines below.

    // Storing each json item in variable
        String id = c.getString(TAG_ID);
        String name = c.getString(TAG_NAME);
        String email = c.getString(TAG_EMAIL);
        String address = c.getString(TAG_ADDRESS);
        String gender = c.getString(TAG_GENDER);

        // Phone number is agin JSON Object
        JSONObject phone = c.getJSONObject(TAG_PHONE);
        String mobile = phone.getString(TAG_PHONE_MOBILE);
        String home = phone.getString(TAG_PHONE_HOME);
        String office = phone.getString(TAG_PHONE_OFFICE);

you can check if jsonobject has a mapping for a specific name by following code

if(jsonObject.has(TAG_NAME)) {
    String name = c.getString(TAG_NAME);
}

or you can check if json has a mapping for a name but its value is null

if(!jsonObject.isNull(TAG_NAME)) {
    String name = c.getString(TAG_NAME);
}

furthermore, you can get an empty string if there is no mapping or there is null value for name

if(jsonObject.optString(TAG_NAME)) {
    String name = c.getString(TAG_NAME);
}

EDIT: You dont create your asyncTask object. Create it before calling its execute method.

doInBack = new DownloadWebPageTask();
doInBack.execute(...)
Sign up to request clarification or add additional context in comments.

3 Comments

or use opt*, optString optInt ... and you will never get a NullPointerException just an empty string
None of the above method worked..same error.. I am not getting where to call AsyncTask in mainactivity. Is the right way of calling the AsyncTask.?
crashin here.. doInBack = (DownloadWebPageTask) doInBack .execute(new String[] { "192.168.1.40" });

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.