0

I have my website with articles and I already have my Json.

So then, I would like to parse my articles in my android app. My code is from: http://www.androidhive.info/2014/07/android-custom-listview-with-image-and-text-using-volley/

It works 100% but what I want is to use it even if there is no internet connection or in offline.

I found this link: How can implement offline caching of json in Android? but I don't know how can I implement it.

I already tried to add this code inside the try catch:

cacheThis.writeObject(MainActivity.this, filename, movieList); movieList.addAll((List) cacheThis.readObject(MainActivity.this, filename));

and removed the movieList.add(movie); but the output is blank.

So here's my code:

public class MainActivity extends Activity implements Serializable {
    // Log tag
    private static final String TAG = MainActivity.class.getSimpleName();

    // Movies json url
    String filename = "time.json";
    private static final String url = "http://api.androidhive.info/json/movies.json";
    private ProgressDialog pDialog;
    private List<Movie> movieList = new ArrayList<Movie>();
    private ListView listView;
    private CustomListAdapter adapter;

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

        listView = (ListView) findViewById(R.id.list);
        adapter = new CustomListAdapter(this, movieList);
        listView.setAdapter(adapter);

        pDialog = new ProgressDialog(this);
        // Showing progress dialog before making http request
        pDialog.setMessage("Loading...");
        pDialog.show();

        // changing action bar color
        getActionBar().setBackgroundDrawable(
                new ColorDrawable(Color.parseColor("#1b1b1b")));

        // Creating volley request obj
        JsonArrayRequest movieReq = new JsonArrayRequest(url,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, response.toString());
                        hidePDialog();

                        // Parsing json
                        for (int i = 0; i < response.length(); i++) {
                            try {

                                JSONObject obj = response.getJSONObject(i);
                                Movie movie = new Movie();
                                movie.setTitle(obj.getString("title"));
                                movie.setThumbnailUrl(obj.getString("image"));
                                movie.setRating(((Number) obj.get("rating"))
                                        .doubleValue());
                                movie.setYear(obj.getInt("releaseYear"));

                                // Genre is json array
                                JSONArray genreArry = obj.getJSONArray("genre");
                                ArrayList<String> genre = new ArrayList<String>();
                                for (int j = 0; j < genreArry.length(); j++) {
                                    genre.add((String) genreArry.get(j));
                                }
                                movie.setGenre(genre);


                                //cacheThis.writeObject(MainActivity.this, filename, movieList);
                                //movieList.addAll((List<Movie>) cacheThis.readObject(MainActivity.this, filename));
                                // adding movie to movies array
                                movieList.add(movie);

                            } catch (JSONException e) {
                                e.printStackTrace();
                            } catch (ClassNotFoundException e) {
                                e.printStackTrace();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                        }

                        // notifying list adapter about data changes
                        // so that it renders the list view with updated data
                        adapter.notifyDataSetChanged();
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        hidePDialog();

                    }
                });

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(movieReq);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        hidePDialog();
    }

    private void hidePDialog() {
        if (pDialog != null) {
            pDialog.dismiss();
            pDialog = null;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
final class cacheThis {
    private cacheThis() {}

    public static void writeObject(Context context, String fileName, Object object) throws IOException {
        FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(object);
        oos.flush();
        oos.close();

        fos.close();
    }

    public static Object readObject(Context context, String fileName) throws IOException,
            ClassNotFoundException {
        FileInputStream fis = context.openFileInput(fileName);
        ObjectInputStream ois = new ObjectInputStream(fis);
        Object object = ois.readObject();
        fis.close();
        return object;
    }
}
Community
  • 1
  • 1

1 Answers1

0

Here is the general pattern you have to follow:

First of all try to load the item from cache. If item exist and did not expire than use it, otherwise make an internet request to fetch the item from web and store the result.

As for your code:

movieList.addAll((List<Movie>) cacheThis.readObject(MainActivity.this, filename));
if (!movieList.isEmpty) {
    JsonArrayRequest movieReq = new JsonArrayRequest(....
    .....
    AppController.getInstance().addToRequestQueue(movieReq);
} else {
    hidePDialog();
}

Also at the end of your JsonArrayRequest you should just call

cacheThis.writeObject(MainActivity.this, filename, movieList);

Yuriy
  • 817
  • 1
  • 7
  • 17
  • You have to remove the dialog in case you loaded from cache. I have edited my response. – Yuriy Aug 14 '15 at 13:02