前言
最近项目中用到了新业务弹屏介绍,需要根据一系列条件判断来展示弹屏,下面记录一下如何实现。
首先我们看一下需求是什么样子的,需要根据哪些条件来判断
,更新时间,时间间隔,最大展示次数,
首先从服务端返回一个对象
public class FlashJson implements Serializable {
private static final String KEY_TATOL_COUNT = "total_";
private static final String KEY_LAST_UPDATE_TIME = "last_update_time_";
@SerializedName("update_time")
public long updateTime; // 单位是秒
@SerializedName("start_time")
public long startTime; // 单位是秒
@SerializedName("end_time")
public long endTime; // 单位是秒
//时间间隔
@SerializedName("spacing")
public int spacingDays;
//最大展示次数
@SerializedName("max_count")
public int maxCount;
@SerializedName("id")
public String id;
@SerializedName("img")
public String img;
@SerializedName("href")
public String href;
@SerializedName("event_type")
public String eventType;
public String getUrl() {
return !TextUtils.isEmpty(eventType) ? eventType : href;
}
然后展示的时候先去判断
// 是否显示
public boolean canShow() {
checkUpdateTime();
long cur = System.currentTimeMillis() / 1000;
long lastShowTime = getLastShowTime(id);
// 在显示的时间获取内, 且未被点击过 或 上次点击时间已超时
return cur >= startTime && cur < endTime && ((cur - lastShowTime) > getDays() * 24 * 3600
&& getShowCount(id) < maxCount && !TextUtils.isEmpty(img));
}
// 检查updateTime 是否变化
private void checkUpdateTime() {
long lastUpdateTime = getLastUpdateTime(id);
// updateTime有改变,移除此id
if (lastUpdateTime != updateTime) {
removeShowInfo(id);
}
}
public static void removeShowInfo(String id) {
Const.SP_HOME_MAIN_FLASH_SHOW.edit().remove(id).commit();
Const.SP_HOME_MAIN_FLASH_SHOW.edit().remove(KEY_TATOL_COUNT + id).commit();
Const.SP_HOME_MAIN_FLASH_SHOW.edit().remove(KEY_LAST_UPDATE_TIME + id).commit();
}
private int getDays() {
return spacingDays < 0 ? 0 : spacingDays;
}
展示过以后我们把内容记录一下
public static void addShowTimeRecord(FlashJson flashJson) {
final String id = flashJson.id;
long cur = System.currentTimeMillis() / 1000;
Const.SP_HOME_MAIN_FLASH_SHOW.edit().putLong(id, cur).commit();
// updateTime
Const.SP_HOME_MAIN_FLASH_SHOW.edit().putLong(KEY_LAST_UPDATE_TIME + id, flashJson.updateTime).commit();
// 总次数
int count = getShowCount(id);
Const.SP_HOME_MAIN_FLASH_SHOW.edit().putInt(KEY_TATOL_COUNT + id, ++count).commit();
}
public class FlashJson implements Serializable {
private static final String KEY_TATOL_COUNT = "total_";
private static final String KEY_LAST_UPDATE_TIME = "last_update_time_";
@SerializedName("update_time")
public long updateTime; // 单位是秒
@SerializedName("start_time")
public long startTime; // 单位是秒
@SerializedName("end_time")
public long endTime; // 单位是秒
//时间间隔
@SerializedName("spacing")
public int spacingDays;
//最大展示次数
@SerializedName("max_count")
public int maxCount;
@SerializedName("id")
public String id;
@SerializedName("img")
public String img;
@SerializedName("href")
public String href;
@SerializedName("event_type")
public String eventType;
public String getUrl() {
return !TextUtils.isEmpty(eventType) ? eventType : href;
}
// 是否显示
public boolean canShow() {
checkUpdateTime();
long cur = System.currentTimeMillis() / 1000;
long lastShowTime = getLastShowTime(id);
// 在显示的时间获取内, 且未被点击过 或 上次点击时间已超时
return cur >= startTime && cur < endTime && ((cur - lastShowTime) > getDays() * 24 * 3600
&& getShowCount(id) < maxCount && !TextUtils.isEmpty(img));
}
private int getDays() {
return spacingDays < 0 ? 0 : spacingDays;
}
// 检查updateTime 是否变化
private void checkUpdateTime() {
long lastUpdateTime = getLastUpdateTime(id);
// updateTime有改变,移除此id
if (lastUpdateTime != updateTime) {
removeShowInfo(id);
}
}
// 已展示次数
private static int getShowCount(String id) {
return Const.SP_HOME_MAIN_FLASH_SHOW.getInt(KEY_TATOL_COUNT + id, 0);
}
public static void addShowTimeRecord(FlashJson flashJson) {
final String id = flashJson.id;
long cur = System.currentTimeMillis() / 1000;
Const.SP_HOME_MAIN_FLASH_SHOW.edit().putLong(id, cur).commit();
// updateTime
Const.SP_HOME_MAIN_FLASH_SHOW.edit().putLong(KEY_LAST_UPDATE_TIME + id, flashJson.updateTime).commit();
// 总次数
int count = getShowCount(id);
Const.SP_HOME_MAIN_FLASH_SHOW.edit().putInt(KEY_TATOL_COUNT + id, ++count).commit();
}
private static long getLastShowTime(String id) {
return Const.SP_HOME_MAIN_FLASH_SHOW.getLong(id, 0);
}
private static long getLastUpdateTime(String id) {
return Const.SP_HOME_MAIN_FLASH_SHOW.getLong(KEY_LAST_UPDATE_TIME + id, 0);
}
public static void removeShowInfo(String id) {
Const.SP_HOME_MAIN_FLASH_SHOW.edit().remove(id).commit();
Const.SP_HOME_MAIN_FLASH_SHOW.edit().remove(KEY_TATOL_COUNT + id).commit();
Const.SP_HOME_MAIN_FLASH_SHOW.edit().remove(KEY_LAST_UPDATE_TIME + id).commit();
}
public static void clearAll() {
Const.SP_HOME_MAIN_FLASH_SHOW.edit().clear().commit();
}
}