2017-10-23 3 views
0

私はサーバーからデータを取得する2つのレスポンスを用意しました。私のコードは正常に動作しています。保存方法SharedPreferencesに2つのレスポンスを追加

しかし、私はSharedPreferencesを使用してこの応答をキャッシュし、そのアクティビティが実行され、アクティビティが破棄されるまでその応答を保持します。私はSharedPreferencesからこの応答を削除します。

これは私のコードです:

public class SampleClass { 
private DataInterface mListener; 

public SampleClass() { 
    super(); 
} 

public void getDataForId(final String id) { 
    ApiInterface apiInterface = APIClient.getApiInterface(); 
    Call<MyResponse> call = apiInterface.getResponse(); 
    call.enqueue(new Callback<MyResponse>() { 
     @Override 
     public void onResponse(Call<MyResponse> call, Response<MyResponse> response) { 
      if (response!=null && response.body() != null && mListener != null) { 
       mListener.responseData(response.body()); 
      } 
     } 
     @Override 
     public void onFailure(Call<MyResponse> call, Throwable t) { 

     } 
    }); 
} 

public void setOnDataListener(DataInterface listener) { 
    mListener = listener; 
} 

public interface DataInterface { 
    void responseData(MyResponse myResponse); 
} 
} 

第2データのクラスファイル

sampleClass.setOnDataListener(new SampleClass.DataInterface() { 
       @Override 
       public void responseData(MyResponse myResponse) { 
// i wanna store this response into SharedPreferences for temp and delete after activity is destroyed.  

        List<Detail> details = myResponse.getDetails(); 
        for (Detail d : details) { 
         if (d.getId().equals(id)) { 
          reqDetail = d; 
          name.setText(reqDetail.getName()); 

          Picasso.with(SecondData.this) 
            .load(reqDetail.getName()) 
            .placeholder(R.mipmap.ic_launcher) 
            .error(R.mipmap.ic_launcher) 
            .into(image); 
         } 
        } 
       } 
      }); 

ApiInterface

public interface ApiInterfaceNew { 

    @GET("/display.php") 
    Call<MyResponse> getResponse();//imp to include MyResponse as a call 
} 

APIクラス

private static final String ROOT_URL = ""; 

    private static Retrofit retrofit1 = null; 
    private static final String CACHE_CONTROL = "Cache-Control"; 

    public static Retrofit getClient() { 
     if (retrofit1 == null) { 
      retrofit1 = new Retrofit.Builder() 
        .baseUrl(ROOT_URL) 
        .client(provideOkHttpClient()) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .build(); 
     } 
     return retrofit1; 
    } 

    public static ApiInterfaceNew getApiInterface() { 
     return getClient().create(ApiInterfaceNew.class); 
    } 

    private static OkHttpClient provideOkHttpClient() { 
     return new OkHttpClient.Builder() 
       .addInterceptor(provideHttpLoggingInterceptor()) 
       .addInterceptor(provideOfflineCacheInterceptor()) 
       .addNetworkInterceptor(provideCacheInterceptor()) 
       .cache(provideCache()) 
       .build(); 
    } 

    private static Cache provideCache() { 
     Cache cache = null; 
     try { 
      cache = new Cache(new File(AppControler.getInstance().getCacheDir(), "http-cache"), 
        10 * 1024 * 1024); // 10 MB 
     } catch (Exception e) { 
      Timber.e("Could not create Cache!"); 
     } 
     return cache; 
    } 

    private static HttpLoggingInterceptor provideHttpLoggingInterceptor() { 
     HttpLoggingInterceptor httpLoggingInterceptor = 
       new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { 
        @Override 
        public void log(String message) { 
         Timber.e(message); 
        } 
       }); 
     httpLoggingInterceptor.setLevel(BuildConfig.DEBUG ? HEADERS : NONE); 
     return httpLoggingInterceptor; 
    } 

    public static Interceptor provideCacheInterceptor() { 
     return new Interceptor() { 
      @Override 
      public Response intercept(Chain chain) throws IOException { 
       Response response = chain.proceed(chain.request()); 

       // re-write response header to force use of cache 
       CacheControl cacheControl = new CacheControl.Builder() 
         .maxAge(2, TimeUnit.MINUTES) 
         .build(); 

       return response.newBuilder() 
         .header(CACHE_CONTROL, cacheControl.toString()) 
         .build(); 
      } 
     }; 
    } 

    public static Interceptor provideOfflineCacheInterceptor() { 
     return new Interceptor() { 
      @Override 
      public Response intercept(Chain chain) throws IOException { 
       Request request = chain.request(); 

       if (!AppControler.hasNetwork()) { 
        CacheControl cacheControl = new CacheControl.Builder() 
          .maxStale(7, TimeUnit.DAYS) 
          .build(); 

        request = request.newBuilder() 
          .cacheControl(cacheControl) 
          .build(); 
       } 

       return chain.proceed(request); 
      } 
     }; 
    } 

AppControlerあなたはObjectMapperまたはGsonのいずれかを使用することができますクラス

public class AppControler extends Application { 

     private static AppControler instance; 

     @Override 
     public void onCreate() 
     { 
      super.onCreate(); 

      instance = this; 

      if (BuildConfig.DEBUG) 
      { 
       Timber.plant(new Timber.DebugTree()); 
      } 

      Timber.i("Creating our Application"); 
     } 

     public static AppControler getInstance() 
     { 
      return instance; 
     } 

     public static boolean hasNetwork() 
     { 
      return instance.checkIfHasNetwork(); 
     } 

     public boolean checkIfHasNetwork() 
     { 
      ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
      return networkInfo != null && networkInfo.isConnected(); 
     } 
+0

https://stackoverflow.com/questions/45904054/retrofit-2-okhttpclient-caching-not-working/45904151#45904151 SharedPrefのレスポンスは良い考えではありません –

+0

コードが疲れていますが、このエラーが発生します。https://i.stack.imgur.com/3ZMap.jpg – feltonjk

+0

ここでインスタンスが初期化されない理由をNullPointerException –

答えて

0

ObjectMapperのために、あなたはまた、応答が成功である場合は、あなたのレトロフィット応じてコードの下に追加

public static UserInfo getUserInfo(Context context) { 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 
    String userDetatails = preferences.getString(AppConstants.USER_INFO_MODEL, ""); 
    Crashlytics.log("get UserInfo "+userDetatails); 
    ObjectMapper mapper = new ObjectMapper(); 
    if (StringUtils.isEmpty(userDetatails)) { 
     return null; 
    } 
    UserInfo userInfo = null; 
    try { 
     userInfo = mapper.readValue(userDetatails, UserInfo.class); 
    } catch (IOException e) { 
     Exceptions.propagate(e); 
    } 
    return userInfo; 
} 
+0

改造応答はどこに渡す必要がありますか?このコードでは? – feltonjk

+0

メソッドが使用可能なレスポンスとコンテキストClassNameを持つメソッドを呼び出すだけです。CommonUtil.updateUserInfo(response、context); –

1

共有設定から保存された応答を取得することができ、以下のコード

public static void updateUserInfo(UserInfo userInfo, Context context) { 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 
    Crashlytics.log("updating User Info "+(userInfo!=null?userInfo.toString():"UserInfo is null")); 
    final SharedPreferences.Editor edit = preferences.edit(); 
    ObjectMapper objectMapper = new ObjectMapper(); 
    try { 
     String value = objectMapper.writeValueAsString(userInfo); 
     edit.putString("USER_INFO_MODEL", value); 
     edit.commit(); 
    } catch (JsonProcessingException e) { 
     Exceptions.propagate(e); 
    } 

} 

を参照することができます。

最初にJSONを文字列とストアに変換します。 prefranceする文字列を保存

Gson gson = new Gson(); 
    String favData = gson.toJson(response.body()); 

あなたが方法下記県のデータコールを取得したいときpreferenceManagerは今

preferenceManager.setStringPreference(Global.OFFLINE_WORD, favData); 

私SharedPrefクラスです。この答えは、おそらく方法は、キャッシングごresponse.Byをキャッシュであなたを助けることができる

public ArrayList<MyResponse> getData(String key) { 
    String data = getStringPreference(key); 
    Gson gson = new Gson(); 

    Type type = new TypeToken<ArrayList<MyResponse>>() { 
    }.getType(); 
    return gson.fromJson(data, type); 
} 
+1

ねえ、私の質問のコードでこのコードを更新できますか? – feltonjk

関連する問題