Преглед изворни кода

Genericized HTTP response to allow any kind of JSON response instead of just Event List.

Thomas Flucke пре 9 година
родитељ
комит
67c68b4f1d

+ 27 - 6
app/src/main/java/com/example/yiupang/freefoodfinder/EventsScreen.java

@@ -3,7 +3,6 @@ package com.example.yiupang.freefoodfinder;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
-
 import android.support.v4.app.Fragment;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -12,6 +11,12 @@ import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.ListView;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
 import java.util.List;
 
 /**
@@ -34,12 +39,28 @@ public class EventsScreen extends Fragment
         httpCall.setUrl("http://free-food-finder.herokuapp.com/events");
         new HttpRequest(){
             @Override
-            public void onResponse(List<Event> response)
+            public void onResponse(JsonNode response, int code)
             {
-                super.onResponse(response);
-                ListView listView = (ListView) view.findViewById(R.id.events_screen);
-                listView.setAdapter(new EventArrayAdapter(view.getContext(), R.layout.events_list_item, response));
-                setItemListener(listView);
+                super.onResponse(response, code);
+                if (code != HttpURLConnection.HTTP_OK)
+                {
+                    /* Error Handling */
+                }
+                else {
+                    ObjectMapper mapper = new ObjectMapper();
+                    TypeFactory typeFactory = mapper.getTypeFactory();
+                    List<Event> events = null;/*Parse to Event Objs*/
+                    try {
+                        events = mapper.reader(
+                                typeFactory.constructCollectionType(List.class, Event.class)
+                        ).readValue(response);
+                    } catch (IOException e) {
+                        /*handle error*/
+                    }
+                    ListView listView = (ListView) view.findViewById(R.id.events_screen);
+                    listView.setAdapter(new EventArrayAdapter(view.getContext(), R.layout.events_list_item, events));
+                    setItemListener(listView);
+                }
             }
         }.execute(httpCall);
 

+ 8 - 31
app/src/main/java/com/example/yiupang/freefoodfinder/HttpRequest.java

@@ -2,13 +2,10 @@ package com.example.yiupang.freefoodfinder;
 
 import android.os.AsyncTask;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.type.TypeFactory;
 
-import java.io.BufferedReader;
 import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.UnsupportedEncodingException;
@@ -16,8 +13,6 @@ import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLEncoder;
 import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -28,6 +23,9 @@ class HttpRequest extends AsyncTask<HttpCall, String, String>
 {
     private static final String UTF_8 = "UTF-8";
 
+    private JsonNode response;
+    private int responseCode;
+
     /**
      * Handle the input and result of the HTTP call
      *
@@ -37,7 +35,6 @@ class HttpRequest extends AsyncTask<HttpCall, String, String>
     protected String doInBackground(HttpCall... params)
     {
         HttpURLConnection urlConnection = null;
-        StringBuilder response = new StringBuilder();
 
         try
         {
@@ -45,7 +42,6 @@ class HttpRequest extends AsyncTask<HttpCall, String, String>
             URL url;
             OutputStream os;
             BufferedWriter writer;
-            int responseCode;
 
             url = new URL(httpCall.getUrl());
             urlConnection = (HttpURLConnection) url.openConnection();
@@ -66,15 +62,8 @@ class HttpRequest extends AsyncTask<HttpCall, String, String>
 
             /*Handle the response*/
             responseCode = urlConnection.getResponseCode();
-            if(responseCode == HttpURLConnection.HTTP_OK)
-            {
-                String line;
-                BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
-                while ((line = br.readLine()) != null)
-                {
-                    response.append(line);
-                }
-            }
+            ObjectMapper mapper = new ObjectMapper();
+            response = mapper.readTree(urlConnection.getInputStream());
         }
         catch (Exception e)
         {
@@ -99,25 +88,13 @@ class HttpRequest extends AsyncTask<HttpCall, String, String>
     protected void onPostExecute(String s)
     {
         super.onPostExecute(s);
-        try
-        {
-            ObjectMapper mapper = new ObjectMapper();
-            TypeFactory typeFactory = mapper.getTypeFactory();
-            List<Event> events = mapper.readValue(s, typeFactory.constructCollectionType(List.class, Event.class));/*Parse to Event Objs*/
-            onResponse(events);
-        }
-        catch (IOException e)
-        {
-            List<Event> eventsError = new LinkedList<>();
-            eventsError.add(new Event("Error", "Error", "Error"));
-            onResponse(eventsError);
-        }
+        onResponse(response, responseCode);
     }
 
     /**
      * It needs to be overwritten by the caller to handle the response
     * */
-    public void onResponse(List<Event> response)
+    public void onResponse(JsonNode response, int code)
     {
 
     }