0

我使用适用于 Android 的异步 Http 客户端来加载我的 JSON 数据。(https://github.com/hr/android-async-http-with-caching

它工作得很好,但如果用户没有连接,我想缓存 json 文件。

我知道如何检查用户是否有互联网连接等,但我使用了一个为 httpresponse 启用缓存的 loopj 异步 Http 客户端版本

问题是我的代码给出的只是一个错误..

    WhtsnxtBase.get(dateje, null, new JsonHttpResponseHandler() {//get url with date of json file

                @Override
                public void onSuccess(JSONObject timeline) {    
                       // code removed isn't relevant for this question           
                }

                @Override
                public void onFailure(Throwable e) {Log.e("MyActivity", "OnFailure!", e);}

                @Override
                public void onFailure(Throwable e, String response) {Log.e("MyActivity", "OnFailure!", e);}

                @Override
                public void onFailure(Throwable e, JSONArray errorResponse) {Log.e("MyActivity", "OnFailure!", e);}

          });

这是网址(查看日期类型等。http ://calvijn.tk/mobiel/2013-07-19

缓存不起作用有人知道如何修复它,或者如何正确使用缓存的库吗?

如果这种方式不可能,是否有人知道一个好的开源缓存管理器或以正确方式缓存 JSON 文件的东西。

4

2 回答 2

2

我建议将这些 JSON 响应解析为本地 java 对象: https ://code.google.com/p/google-gson/

我使用 GSON 将 JSON 对象序列化为 Java 类。这使得在您的应用程序中处理数据变得更加容易。

如果您想在用户离线时正确保存数据,您可能需要考虑使用 Android 的 SQLite 数据库来保存大量对象。对于一些简单的事情,您可以使用 ORMLite。

现在我正在使用 ORMLite 并构建了一个自定义内容提供程序来处理本地数据。这允许我使用 SimpleCursorAdapter 和 LoaderManagers。

于 2013-07-23T21:18:35.063 回答
1

在你的内部JsonHttpResponseHandler你得到你的JSON,onSuccess()所以你需要从那里缓存数据,同时你有两个选择:存储sqlite或使用file cachingonfailure()当你没有得到你的对象时调用没有连接或超时。

public class JSONCache
{
    public static void writeToCache( String fileName ,JSONObject jObject )
    {
        ObjectOutput out = new ObjectOutputStream(new FileOutputStream(new File(fileName)));
        out.writeObject( jObject );
        out.close();
    }
    public static JSONObject readFromCache(String fileName )
    {
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File(fileName)));
        JSONObject jsonObject = (JSONObject) in.readObject();
        in.close();
        retrun jsonObject;
    }
}

并在您的响应处理程序中

WhtsnxtBase.get(dateje, null, new JsonHttpResponseHandler() {

                @Override
                public void onSuccess(JSONObject timeline)
                {    
                       ...
                       JSONCache.writeToCache( "cache_file_path" , timeline );
                       //updateUI(timeline);
                }

                @Override
                public void onFailure(Throwable e)
                {
                      Log.e("MyActivity", "OnFailure!", e);
                      JSONCache.readFromCache( "cache_file_path" );
                }

                @Override
                public void onFailure(Throwable e, String response)
               {
                      Log.e("MyActivity", "OnFailure!", e);
                      JSONObject timeline = JSONCache.readFromCache( "cache_file_path" );
                      //updateUI(timeline);

               }

                @Override
                public void onFailure(Throwable e, JSONArray errorResponse)
                {
                      Log.e("MyActivity", "OnFailure!", e);
                      JSONObject timeline = JSONCache.readFromCache( "cache_file_path" );
                      //updateUI(timeline);

                }
          });
于 2014-02-12T08:15:57.283 回答