0

JSON データをロードするために、Android 用の非同期 HTTP クライアントを使用します ( 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);}

          });

これはURLです(ワットの種類を見るには、それが何であるかなど.. 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()ため、そこからデータをキャッシュする必要があります.store insqliteまたはusefile cachingの2つのオプションがありonfailure()ますが、オブジェクトが接続されていないかタイムアウトになっている場合に呼び出されます。

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 に答える