-1

My android app with json part in Mainactivity is not working on 4.2(api 17)
(Unfortunately app has stopped) dialogbox appears . but is working properly in 2.2(api 8),2.3.5(api 10) . Is there any problem with "android versions" with same code on different devices. ?

private static String url = "http://api.androidhive.info/contacts/";

    // 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_PHONE = "phone";
    private static final String TAG_PHONE_MOBILE = "mobile";


    // contacts JSONArray
    JSONArray contacts = null;


Button login_btn,other;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);// Hashmap for ListView
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

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

    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(url);

    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);


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


            // 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();
    }


    /**
     * 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);

        }
    });
Dips
  • 23
  • 4

2 Answers2

1

Recent android versions do not allow you to do activities such as network operations, in your main thread as they could result in ANR. So, the recommended and correct way to download your json would be through an AsyncTask.

battery
  • 502
  • 6
  • 26
1

It's androidhive not bothering to update their tutorials again. If you look at

public JSONObject getJSONFromUrl,

then you will see that they do indeed do their networking on the main thread as battery as suggested. Also they don't even catch the NetworkOnMainThreadException which your code will undoubtedly throw. You need to move your networking off the UI thread.

NickT
  • 23,844
  • 11
  • 78
  • 121
  • I'm on mobile so couldn't mention the useful exception name :-) +1 for that! – battery Oct 27 '13 at 11:59
  • Thanks NickT to give suggesions – Dips Oct 27 '13 at 12:02
  • Have a look at http://stackoverflow.com/questions/12852954/how-to-create-asynctask-to-prevent-networkonmainthreadexception. You could use this as a template to work from. – NickT Oct 27 '13 at 12:08