如何将Retrofit 2响应保存到SharedPreferences中

时间:2017-10-23 20:50:14

标签: java android json retrofit2

我有一个改装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 );
}
}

SecondData类文件

    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类

 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();
        }

2 个答案:

答案 0 :(得分:2)

当响应成功时,在您的Retrofit响应中添加以下代码。

首先将JSON转换为字符串并存储。

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

将字符串保存到prefrance。

     

preferenceManager是我的SharedPref类

  preferenceManager.setStringPreference(Global.OFFLINE_WORD, favData);

现在当你想在方法下面获得pref数据调用时。

 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 :(得分:0)

您可以使用ObjectMapper或Gson。

对于ObjectMapper,您可以参考以下代码

 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);
    }

}

您还可以从共享偏好中获取存储的响应

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;
}