Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

This class retrieves JSON data from a PHP script and uses the data to populate a ListView using AsyncTasks. Any ideas on how to improve it?

public class MainActivity extends ActionBarActivity {

    ArrayList<Location> arrayOfLocations;
    LocationAdapter adapter;

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

        // Construct the data source
        arrayOfLocations = new ArrayList<Location>();

        // Create the adapter to convert the array to views
        adapter = new LocationAdapter(this, arrayOfLocations);

        FillLocations myFill = new FillLocations();
        myFill.execute();

    }

        //this class downloads an image and passes that (and other data) into an
        //adapter which populates the ListView
    class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
        private int photoID = 1;
        JSONObject json = null;

        public BitmapWorkerTask(int photoID, JSONObject json) {
            // Use a WeakReference to ensure the ImageView can be garbage
            // collected
            this.photoID = photoID;
            this.json = json;
        }

        protected void onPreExecute() {

        }

        // Decode image in background.
        @Override
        protected Bitmap doInBackground(Integer... params) {
            String initialURL = "http://afs.spotcontent.com/img/Places/Icons/";
            final String updatedURL = initialURL + photoID + ".jpg";
            Bitmap bitmap2 = null;

            try {
                bitmap2 = BitmapFactory.decodeStream((InputStream) new URL(
                        updatedURL).getContent());

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return bitmap2;
        }

        // Once complete, see if ImageView is still around and set bitmap.
        @Override
        protected void onPostExecute(Bitmap bitmap2) {
            try {
                adapter.add(new Location(bitmap2, json.getString("PlaceTitle"),
                        json.getString("PlaceDetails"), json
                                .getString("PlaceDistance"), json
                                .getString("PlaceUpdatedTime")));
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

        //this class retrieves the JSON data from the PHP script
        //and parses it, then it calls the Bitmap task to get the
        //image and then add the location
    private class FillLocations extends AsyncTask<Integer, Void, String> {

        protected void onPreExecute() {
        }

        // Decode image in background.
        @Override
        protected String doInBackground(Integer... params) {

            String result = "";
            InputStream isr = null;
            try {
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://myscript.php/"); // YOUR
                                                                                    // PHP
                                                                                    // SCRIPT
                                                                                    // ADDRESS
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                isr = entity.getContent();
                // resultView.setText("connected");
            } catch (Exception e) {
                Log.e("log_tag", "Error in http connection " + e.toString());
            }
            // convert response to string
            try {
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(isr, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                isr.close();

                result = sb.toString();
            } catch (Exception e) {
                Log.e("log_tag", "Error  converting result " + e.toString());
            }

            // parse json data
            try {
                JSONArray jArray = new JSONArray(result);

                for (int i = 0; i < jArray.length(); i++) {
                    final JSONObject json = jArray.getJSONObject(i);
                    counter++;

                    try {

                        BitmapWorkerTask myTask = new BitmapWorkerTask(
                                json.getInt("ID"), json);
                        myTask.execute();

                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }

            } catch (Exception e) {
                // TODO: handle exception
                Log.e("log_tag", "Error Parsing Data " + e.toString());
            }
            return msg;

        }

        protected void onPostExecute(String msg) {
            // Attach the adapter to a ListView
            ListView listView = (ListView) findViewById(R.id.listView1);

            listView.setAdapter(adapter);

        }
    }
}
share|improve this question
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.