-1

I have following code for the JSON parser. Actually I did not wrote it by myself, I collected it from various of stackoverflow questions. But somehow it does not work. I gave the permission to use the internet:

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
    String url=null;
    // constructor
    public JSONParser() {

    }

    // function get JSON from URL
    public JSONObject makeHttpRequest(String url) {
        BackGroundTask Task= new BackGroundTask(url);
        try {
            return Task.execute().get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }
    public class BackGroundTask extends AsyncTask<String, String, JSONObject>{
        String URL=null;
        public BackGroundTask(String url) {
            URL = url;
        }
        @Override
        protected JSONObject doInBackground(String... params) {
            // TODO Auto-generated method stub

            // Making HTTP request
            try {
                // Making HTTP request 

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

        }
    }
}

EDIT:

Can you see any problematic part that can cause this class to fail? I debugged my code and found out that after this lines

JSONParser jParser = new JSONParser();
JSONObject json = jParser.makeHttpRequest(URL);

the json object is null.

hevele
  • 903
  • 6
  • 20
  • 38

1 Answers1

0

AsyncTasks are not really suited for networking on Android. As the docs state : they are designed for "short living tasks". And networking doesn't belong to this category. Moreover, using async tasks will lead to some important troubles with respect to Activities life cycle. To get convinced, just rotate your device, and you will see that your network request isn't able to update your UI.

I would suggest you to have a look at RoboSpice, this library is much more interesting when it comes to networking. Moreover, the spring android module will let you parse json very easily.

Btw, I am one of the authors of RS...

Snicolas
  • 37,840
  • 15
  • 114
  • 173
  • I posted another question on how to write any parser for JSON on android, and almost everyone offered me to do it asynchronously. You can reach the question from [here](http://stackoverflow.com/questions/16418425/parsing-a-json-file-in-android-application). It would be really bad if I start to learn something else. – hevele May 07 '13 at 13:54
  • RS is designed to make it *much* easier to execute network request asynchronously. Have a simple look at it, at least. Pretty sure you would like it. – Snicolas May 07 '13 at 14:40