布尔值不变

时间:2019-01-30 13:26:36

标签: android sharedpreferences

我想从后台服务的另一个函数中调用一个函数以显示一条消息。问题是我正在检查布尔值,当我打开应用程序时,它会初始化为 false 再次,以便它再次运行该功能(我只想要一次)。

代码如下:

OnCreate:

 public void onCreate() {
    handler = new Handler();
    runnable = new Runnable() {
        public void run() {          
            milestoneCheck();// THE FIRST FUNCTION
            handler.postDelayed(runnable, 10000);
        }
    };

    handler.postDelayed(runnable, 15000);

}

第一个功能

public void milestoneCheck() {
    totalKm =(int) Float.parseFloat(TripsInfo.km.get(TripsInfo.userRank - 1));

    SharedPreferences sharedPreferencesInac = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    isSeen =sharedPreferencesInac.getBoolean("inactive", false);

    if (totalKm ==84 && !isSeen) {
        milestoneNotification(totalKm);
        isSeen = true;
    } else if (totalKm == 130 && isSeen) {
        milestoneNotification(totalKm);
        isSeen = false;
    } else if (totalKm == 200 && !isSeen) {
        milestoneNotification(totalKm);
    }

}

在我的主要活动中,我也有这样的共享首选项

 SharedPreferences sharedPreferencesIn = getSharedPreferences("inactivity", Context.MODE_PRIVATE);
    SharedPreferences.Editor editorIn = sharedPreferencesIn.edit();
    editorIn.putBoolean("inactive", false);
    editorIn.apply();

SharedPreferences sharedPreferencesInac = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        isSeen =sharedPreferencesInac.getBoolean("inactive", false);

最后isSeen是我的mainactivity中的一个公共静态变量!

所以问题是,在开始时isSeen为false,然后为true,但是如果我重新打开,则应用程序又为false。

更新

private void updateTrue() {

    SharedPreferences sharedPreferencesIn = getSharedPreferences("inactivity", Context.MODE_PRIVATE);
    SharedPreferences.Editor editorIn = sharedPreferencesIn.edit();
    editorIn.putBoolean("inactive", true);
    editorIn.apply();

    SharedPreferences sharedPreferencesInac = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    isSeen =sharedPreferencesInac.getBoolean("inactive", true);
}

UPDATE V2

我更改了功能并将其放在Asynctask上,但仍然遇到相同的问题

protected String doInBackground(String... aurl) {
        totalKm =(int) Float.parseFloat(TripsInfo.km.get(TripsInfo.userRank - 1));


        Log.d("test","before"+isSeen);

        if (totalKm ==84 && !isSeen ) {
            milestoneNotification(totalKm);
            updateTrue(true);
        } else if (totalKm == 130 && isSeen) {
            milestoneNotification(totalKm);

        } else if (totalKm == 200 ) {
            milestoneNotification(totalKm);

        }

        test=getSharedPreferences("inactivity",0);
        isSeen=test.getBoolean("inactive",false);
        Log.d("test","after"+isSeen);

        return null;
    }

 private void updateTrue(boolean value) {

    SharedPreferences sharedPreferencesIn = getSharedPreferences("inactivity",Context.MODE_PRIVATE);
    SharedPreferences.Editor editorIn = sharedPreferencesIn.edit();
    editorIn.putBoolean("inactive", value);
    editorIn.apply();

    test=getSharedPreferences("inactivity",0);
    isSeen=test.getBoolean("inactive",false);
    Log.d("test","function"+isSeen);
}

updateTrue()在AsyncTask上不是

2 个答案:

答案 0 :(得分:0)

您将inactive设置为false

SharedPreferences.Editor editorIn = sharedPreferencesIn.edit();
    editorIn.putBoolean("inactive", false);
    editorIn.apply();

如果您以后希望它为true,请将其设置为true

editorIn.putBoolean("inactive", true);

答案 1 :(得分:0)

isSeen变量设置为true不会更改保存在boolean中的SharedPreferences值。您必须自己做。

以下if statement

if (totalKm ==84 && !isSeen) {
    milestoneNotification(totalKm);
    isSeen = true;
}

替换

isSeen = true;

调用一个函数,该函数会将boolean中的true值更新为SharedPreferences

编辑1

更新SharedPreferences的方法

public void updateSharedPreferences(boolean value) {
    SharedPreferences sharedPreferencesIn = 
                            getSharedPreferences("inactivity", Context.MODE_PRIVATE);

    SharedPreferences.Editor editorIn = sharedPreferencesIn.edit();

    editorIn.putBoolean("inactive", value);
    editorIn.apply();
}

现在,当您想将boolean中的true值设置为SharedPreferences时,只需调用该方法并传递true作为参数即可。

updateSharedPreferences(true);

类似地,您可以再次将其设置为false,只需将false作为参数传递

updateSharedPreferences(false);

编辑2

读取保存在SharedPreferences中的值的方法

public boolean readFromSharedPrefs() {
    SharedPreferences sharedPreferencesIn = 
                            getSharedPreferences("inactivity", Context.MODE_PRIVATE);

    return sharedPreferencesIn.getBoolean("inactive", false);
}

在任何要检索保存在SharedPreferences中的值的地方调用此方法

boolean isSeen = readFromSharedPrefs();