是否存储在SharedPreferences中存储服务器响应

时间:2017-03-30 06:47:44

标签: android sharedpreferences

我想将我的服务器响应存储为共享首选项中的字符串,以便稍后可以使用此响应而无需从服务器获取。但是当我将数据保存在共享首选项中以后我使用时我会错过整个响应。我没有安全问题和任何其他原因,如卸载应用程序等。我的问题是响应是否会在共享首选项中丢失,以便响应包含多个JSONObject和JSONArray。

private void productListApi(String url){
    final ProgressDialog pDialog = new ProgressDialog(mContext);
    pDialog.setMessage(mContext.getResources().getString(R.string.loading_message));
    pDialog.show();
    System.out.println("product list urlllllllllllllllllllll:" + url);

    RequestQueue mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext());

    StringRequest postRequest = new StringRequest(Request.Method.POST, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    System.out.println("response of product list data is:"
                            + response);
                    apiResponse = response ;
                    pDialog.dismiss();
                    try {
                        JSONObject json = new JSONObject(response);
                        if (json.has("code")) {

                            if (code.equalsIgnoreCase("200")) {

                                //set response to shared preference
                                SharedPreference.setStringValue(mContext, SharedPreference.PRODUCT_LIST_RESPONSE, response);

                                parseData(SharedPreference.getStringValue(mContext,SharedPreference.PRODUCT_LIST_RESPONSE));


                            }else {
                                UserDialog
                                        .showUserAlert(mContext,
                                                mContext.getResources().getString(R.string.product_list_failed));
                            }
                        }
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }


                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
            pDialog.dismiss();
            UserDialog.showUserAlert(mContext,
                    mContext.getResources().getString(R.string.no_response));
        }
    }) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<>();
            // the POST parameters:

            params.put("user_id", SharedPreference.getStringValue(getActivity(), SharedPreference.USER_ID));
            params.put("temp_user_id", SharedPreference.getStringValue(getActivity(), SharedPreference.TEMP_USER_ID));
            params.put("version", Utilities.getVersionCode(mContext));
            params.put("device_token", SharedPreference.getStringValue(getActivity(), SharedPreference.DEVICE_TOKEN));
            return params;
        }
    };

    int socketTimeout = Constant.socketTimeout
            ;//30 seconds - change to what you want
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    //RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    postRequest.setRetryPolicy(policy);
    mRequestQueue.add(postRequest);

}
public class SharedPreference {

SharedPreferences preferences;
SharedPreferences.Editor editor;

private static final String PREFS_NAME = "nevada_food";

public static final String PRODUCT_LIST_RESPONSE = "product_list" ;

public SharedPreference() {
    super();
    // TODO Auto-generated constructor stub
}

public static String getStringValue(final Context context, String key) {
    return context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
            .getString(key, "");
}

public static void setStringValue(final Context context, String key,
                                  String value) {
    final SharedPreferences prefs = context.getSharedPreferences(
            PREFS_NAME, Context.MODE_PRIVATE);
    final SharedPreferences.Editor editor = prefs.edit();

    editor.putString(key, value);
    editor.commit();
}

}

这是我的服务器响应。我将其保存在共享首选项中,并在共享首选项中解析UI中的数据。这种方法
   parseData(SharedPreference.getStringValue(mContext,SharedPreference.PRODUCT_LIST_RESPONSE)); 直接从服务器第一次正常工作,但是当我们在另一个方法中使用此方法时,它不起作用。

3 个答案:

答案 0 :(得分:0)

  

我的问题是响应是否会在共享首选项中丢失

共享偏好不会被删除/丢失,除非:

  1. 你删除它们
  2. 用户清除应用数据
  3. 因此,您可以安全地存储必要的数据。

答案 1 :(得分:0)

存储在SharedPreference中的数据不会丢失,除非:

  1. 您可以手动或以编程方式清除它。
  2. 任何缓存清算应用程序都不会清除应用程序缓存。
  3. 您卸载了应用程序。
  4. 根据具体情况,您可以选择以下方法来保存/缓存您的json数据/响应:

    1. SharedPreference使用起来更方便。
    2. 将文本文件写为外部/内部存储中的私有或公共文件。即使您卸载应用程序,存储在外部存储中的数据也不会丢失。
    3. 如果json很大,每次你可以创建Sqlite数据库或者可以选择ORMLite,GreeDao等ORM工具时,与调用服务器有关的权衡。

    4. 缓存库可用于缓存服务器响应。

答案 2 :(得分:0)

您使用错误的方式保存到SharedPreference。

您的密码:

 //set response to shared preference
  SharedPreference.setStringValue(mContext, SharedPreference.PRODUCT_LIST_RESPONSE, response);
  parseData(SharedPreference.getStringValue(mContext,SharedPreference.PRODUCT_LIST_RESPONSE));

我不知道你在这里写的是什么。试试我的解决方案。

您必须遵循简单的SharedPreference格式,然后是编辑器。

只需保存您的数据,如下所示:

SharedPreferences.Editor editor = getSharedPreferences("PREFS_NAME", 0).edit();
editor.putString("PRODUCT_LIST_RESPONSE", response);
editor.commit();

通过 KEY PRODUCT_LIST_RESPONSE 此处)获取

SharedPreferences prefs = getSharedPreferences("PREFS_NAME", 0); 
String response = prefs.getString("PRODUCT_LIST_RESPONSE", any_default_Value);