如何在 android java 中实现每日连胜计数器?
How to implement a daily streak counter in android java?
我想为用户实施每日连胜计数器。
如果用户 return 第二天使用该应用,则连续计数应增加 1,如果用户未 return 使用该应用,则连续计数应再次 return 至 1接下来的连续一天。
到目前为止,我已经尝试使用图像中给定的方法来实现它,但我的每日连续记录总是显示 1。
我认为这是因为它永远不会进入 'else' 部分。
你们能帮我解决这个问题吗thing.Any非常感谢您的帮助。
savedInstanceState 将在应用程序启动时 return 为空,您必须像下面这样检查首次使用的用户。
if preferences.getInt(STREAKS) == null{
}else {}
如果用户是第一次登录
- 初始化上次登录日期并重置连续记录
其他
- 如果用户在同一天登录
什么都不做
- 如果用户连续几天登录
增加连胜并更新上次登录日期
- 如果上次登录日期超过一天
重置连胜和上次登录日期
下面是伪实现
class ConsecutiveDayChecker {
/**
* Call this method when user login
*/
public void onUserLogin() {
DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
Date date = new Date();
String today = dateFormat.format(date);
String lastLoginDay = getLastLoginDate();
String yesterday = getYesterdayDate(dateFormat, date);
if (lastLoginDay == null) {
// user logged in for the first time
updateLastLoginDate(today);
incrementDays();
} else {
if (lastLoginDay.equals(today)) {
// User logged in the same day , do nothing
} else if (lastLoginDay.equals(yesterday)) {
// User logged in consecutive days , add 1
updateLastLoginDate(today);
incrementDays();
} else {
// It's been more than a day user logged in, reset the counter to 1
updateLastLoginDate(today);
resetDays();
}
}
}
private String getYesterdayDate(DateFormat simpleDateFormat, Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, -1);
return simpleDateFormat.format(calendar.getTime());
}
/**
* Update last login date into the storage
* @param date
*/
private void updateLastLoginDate(String date) {
// SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
// SharedPreferences.Editor editor = sharedPref.edit();
// editor.putString("last_login_day", date);
// editor.apply();
}
/**
* Get last login date
* @return
*/
private String getLastLoginDate() {
// String lastLogin = null;
// SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
// lastLogin = sharedPref.getString("last_login_day", null);
// return lastLogin;
}
private int getConsecutiveDays() {
// int days = 0;
// SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
// days = sharedPref.getInt("num_consecutive_days", 0);
// return days;
}
private void incrementDays() {
// int days = getConsecutiveDays() + 1;
// SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
// SharedPreferences.Editor editor = sharedPref.edit();
// editor.putInt("num_consecutive_days", days);
// editor.apply();
}
private void resetDays() {
// int days = 1;
// SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
// SharedPreferences.Editor editor = sharedPref.edit();
// editor.putInt("num_consecutive_days", days);
// editor.apply();
}
public int getStreak() {
return getConsecutiveDays();
}
}
我用这个得到了我想要的东西:
if(getSharedPreferences(SHARED_PREF_TIME, MODE_PRIVATE).getInt(STREAKS,0)==0){
}
否则{
}
我想为用户实施每日连胜计数器。 如果用户 return 第二天使用该应用,则连续计数应增加 1,如果用户未 return 使用该应用,则连续计数应再次 return 至 1接下来的连续一天。
到目前为止,我已经尝试使用图像中给定的方法来实现它,但我的每日连续记录总是显示 1。 我认为这是因为它永远不会进入 'else' 部分。
你们能帮我解决这个问题吗thing.Any非常感谢您的帮助。
savedInstanceState 将在应用程序启动时 return 为空,您必须像下面这样检查首次使用的用户。
if preferences.getInt(STREAKS) == null{
}else {}
如果用户是第一次登录
- 初始化上次登录日期并重置连续记录
其他
- 如果用户在同一天登录 什么都不做
- 如果用户连续几天登录 增加连胜并更新上次登录日期
- 如果上次登录日期超过一天 重置连胜和上次登录日期
下面是伪实现
class ConsecutiveDayChecker {
/**
* Call this method when user login
*/
public void onUserLogin() {
DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
Date date = new Date();
String today = dateFormat.format(date);
String lastLoginDay = getLastLoginDate();
String yesterday = getYesterdayDate(dateFormat, date);
if (lastLoginDay == null) {
// user logged in for the first time
updateLastLoginDate(today);
incrementDays();
} else {
if (lastLoginDay.equals(today)) {
// User logged in the same day , do nothing
} else if (lastLoginDay.equals(yesterday)) {
// User logged in consecutive days , add 1
updateLastLoginDate(today);
incrementDays();
} else {
// It's been more than a day user logged in, reset the counter to 1
updateLastLoginDate(today);
resetDays();
}
}
}
private String getYesterdayDate(DateFormat simpleDateFormat, Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, -1);
return simpleDateFormat.format(calendar.getTime());
}
/**
* Update last login date into the storage
* @param date
*/
private void updateLastLoginDate(String date) {
// SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
// SharedPreferences.Editor editor = sharedPref.edit();
// editor.putString("last_login_day", date);
// editor.apply();
}
/**
* Get last login date
* @return
*/
private String getLastLoginDate() {
// String lastLogin = null;
// SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
// lastLogin = sharedPref.getString("last_login_day", null);
// return lastLogin;
}
private int getConsecutiveDays() {
// int days = 0;
// SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
// days = sharedPref.getInt("num_consecutive_days", 0);
// return days;
}
private void incrementDays() {
// int days = getConsecutiveDays() + 1;
// SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
// SharedPreferences.Editor editor = sharedPref.edit();
// editor.putInt("num_consecutive_days", days);
// editor.apply();
}
private void resetDays() {
// int days = 1;
// SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
// SharedPreferences.Editor editor = sharedPref.edit();
// editor.putInt("num_consecutive_days", days);
// editor.apply();
}
public int getStreak() {
return getConsecutiveDays();
}
}
我用这个得到了我想要的东西:
if(getSharedPreferences(SHARED_PREF_TIME, MODE_PRIVATE).getInt(STREAKS,0)==0){
} 否则{
}