共享首选项不应用更改

时间:2017-11-15 22:33:05

标签: java android android-activity sharedpreferences

我有一个活动(A)检查我的服务器是否有APK更新。调用此函数时,无论是否存在更新,我都需要编辑共享首选项,以便应用程序知道跳过或运行实际更新活动(B)。问题1是,为什么共享偏好不被活动(A)编辑?问题2是,如果他们正在编辑,为什么没有活动(B)阅读它们?

提前谢谢你!

应在此处编辑共享首选项(活动(A)):

    private void parseJson(String result) {
    try {

        JSONObject obj = new JSONObject(result);
        String updateMessage = obj.getString(Constants.APK_UPDATE_CONTENT);
        String apkUrl = obj.getString(Constants.APK_DOWNLOAD_URL);
        int apkCode = obj.getInt(Constants.APK_VERSION_CODE);

        int versionCode = AppUtils.getVersionCode(mContext);

        if (apkCode > versionCode) {
            if (mType == Constants.TYPE_NOTIFICATION) {
                showNotification(mContext, updateMessage, apkUrl);
            } else if (mType == Constants.TYPE_DIALOG) {
                SharedPreferences pref = mContext.getSharedPreferences("ActivityUpdatePREF", Context.MODE_PRIVATE);
                SharedPreferences.Editor ed = pref.edit();
                ed.putBoolean("activity_update", true);
                ed.apply();
                showDialog(mContext, updateMessage, apkUrl);
            }
        } else if (mShowProgressDialog) {
            SharedPreferences pref = mContext.getSharedPreferences("ActivityUpdatePREF", Context.MODE_PRIVATE);
            SharedPreferences.Editor ed = pref.edit();
            ed.putBoolean("activity_update", false);
            ed.apply();
            Toast.makeText(mContext, mContext.getString(R.string.android_auto_update_toast_no_new_update), Toast.LENGTH_SHORT).show();
        }

    } catch (JSONException e) {
        Log.e(Constants.TAG, "parse json error");
    }
}

活动(B):

        SharedPreferences pref = getSharedPreferences("ActivityUpdatePREF", Context.MODE_PRIVATE);
    if(pref.getBoolean("activity_update", false)){
        Intent intent = new Intent(this, Main.class);
        deleteCache(getApplicationContext());
        startActivity(intent);
        finish();
    } else {
        functionUp();
    }

3 个答案:

答案 0 :(得分:1)

使用commit()而不是apply()

  

与commit()不同,后者将其首选项写入持久性   同步存储,apply()将其更改提交到内存中   SharedPreferences立即启动异步提交   磁盘,您不会收到任何故障通知。如果是其他编辑   这个SharedPreferences在apply()时执行常规commit()   仍然未完成,commit()将阻塞,直到所有异步提交为止   完成以及提交本身。

https://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()

答案 1 :(得分:0)

您的代码没问题,您应该检查ed.apply();执行的是您的代码。

Activity(A)中,您应该检查程序的执行顺序。

1.确保已执行parseJson方法。

2.如果您解析json错误,则应检查JSONException

Log.e(Constants.TAG, "parse json error");
e.printStackTrace();

3.如果apkCode > versionCode已执行,mType == Constants.TYPE_DIALOG是否已执行?

4.如果apkCode < versionCode已执行,代码中mShowProgressDialog是否为真?

您可以添加日志进行检查。

ed.apply();
Log.e(Constants.TAG, "SharedPreferences is apply");

答案 2 :(得分:0)

使用ed.commit()而不是ed.apply()