背景:
C端以前遇到活动做得相对来说比较轻量,例如是在底部 tab 下发不同样式的 icon ,部分楼盘的标签更换图片。
但是随着业务的发展,我们的活动会做得越来越重。从这次 6.4.8 单独做提报系统来管理活动我们就能看得出来。
问题:
但是实际上 API 和 客户端对活动的管理还是零散的、不同步的,举这次 6.4.8 的例子。
1 首页搜索栏和 banner 背景的样式切换依赖 /common/v4/conf 接口
2 底部 tab 活动样式变更依赖 theme-config 接口
3 还有一些详情页 和 列表页卡片的部分样式依赖 project/index 接口
4 首页金刚按钮样式
这样造成的问题是 1 活动接口比较零散没有统一管理 2 因为接口的先后顺序以及触发实际导致活动样式存在不同时间段的先后展示
思考:
现在后端已经存在提报系统,未来活动权重如果继续加重。可能还会存在切换不同城市展示不同的主题效果。这次做首页和列表页的主题样式产生一些思考如下
未来活动单独做一个子模块,例如由 ActivityManager 统一去管理活动
把不需要单个楼盘存在单独活动逻辑的主题样式统一管理:
ActivityManager 存在四个职责:
1 Activity HTTP 管理活动的接口请求
2 Activity Data Cache 活动缓存以及数据更新策略
3 Activity API 接口对外提供,例如:
a 是否是活动时间
b 获取提报 id
c 获取活动主题颜色
4 Activity Dispatch 活动事件订阅和分发
举个例子客户端某处需要新增主题活动样式,只需要在此处。通过
ActiveManager.getInstance().addActivityThemeChangeListener(this);
订阅活动,存在活动变更时候订阅的位置及时收到活动事件变更的分发。
ActivityManager 统一管理能做到处理集中方便管理,刷新时序一致,未来方便扩展。
附上 6.4.8 这版本 ActivityManager 实现
/**
* 活动相关管理类
* 切换城市依赖服务接口下发更新本地数据
*/
public class ActiveManager {
public static final String TAG = ActiveManager.class.getSimpleName();
private static volatile ActiveManager mInstance;
public List<ActivityThemeChangeListener> list = new ArrayList<>();
private ActiveManager() {
}
public static ActiveManager getInstance() {
if (mInstance == null) {
synchronized (ActiveManager.class) {
if (mInstance == null) {
mInstance = new ActiveManager();
}
}
}
return mInstance;
}
/**
* 是否在活动期间
*/
public boolean isActivityTime() {
String jsonString = SPUtils.getString(SPUtils.ACTIVITY_CONFIG);
return !TextUtils.isEmpty(jsonString);
}
/**
* 获取提报 id
*
* @return 提报 id
*/
public String getActivityId() {
String jsonString = SPUtils.getString(SPUtils.ACTIVITY_CONFIG);
if (TextUtils.isEmpty(jsonString)) {
return "";
}
HomeNewFragmentConfigEntity.ActiveConfig activeConfig = parseJsonToModel(jsonString, "getActivityId");
if (activeConfig != null && !TextUtils.isEmpty(activeConfig.getSubmissionId())) {
return activeConfig.getSubmissionId();
} else {
return "";
}
}
/**
* 获取活动主题色值 格式 #RRGGBB
*
* @return 活动主题色
*/
public String getActivityThemeColor() {
String jsonString = SPUtils.getString(SPUtils.ACTIVITY_CONFIG);
if (TextUtils.isEmpty(jsonString)) {
return "";
}
HomeNewFragmentConfigEntity.ActiveConfig activeConfig = parseJsonToModel(jsonString, "getActivityThemeColor");
if (activeConfig != null && activeConfig.getSearchStyle() != null && !TextUtils.isEmpty(activeConfig.getSearchStyle().getSearchColour())) {
return activeConfig.getSearchStyle().getSearchColour();
} else {
return "";
}
}
/**
* 获取活动主题首页 banner 背景图片
*
* @return 活动主题 banner 背景图片
*/
public String getActivityBannerBgUrl() {
String jsonString = SPUtils.getString(SPUtils.ACTIVITY_CONFIG);
if (TextUtils.isEmpty(jsonString)) {
return "";
}
HomeNewFragmentConfigEntity.ActiveConfig activeConfig = parseJsonToModel(jsonString, "getActivityBannerBgUrl");
if (activeConfig != null && !TextUtils.isEmpty(activeConfig.getActiveBgImage())) {
return activeConfig.getActiveBgImage();
} else {
return "";
}
}
/**
* 清除活动缓存
*/
public void clear() {
SPUtils.remove(SPUtils.ACTIVITY_CONFIG);
}
/**
* 更新活动缓存
*/
public void updateActiveCache(HomeNewFragmentConfigEntity.ActiveConfig activeConfig) {
if (activeConfig == null) {
clear();
finishListener();
return;
}
String activeConfigString = "";
try {
activeConfigString = GsonUtils.toJson(activeConfig, HomeNewFragmentConfigEntity.ActiveConfig.class);
} catch (Exception e) {
Log.e(TAG, "updateActiveCache", e);
clear();
finishListener();
}
Log.e(TAG, "updateActiveCache : " + activeConfigString);
if (!TextUtils.isEmpty(activeConfigString)) {
SPUtils.put(SPUtils.ACTIVITY_CONFIG, activeConfigString);
if (list != null && list.size() > 0) {
for (ActivityThemeChangeListener listener : list) {
listener.onChangeTheme(activeConfig);
}
}
} else {
clear();
finishListener();
}
}
private HomeNewFragmentConfigEntity.ActiveConfig parseJsonToModel(String jsonString, String methodName) {
try {
return GsonUtils.fromJson(jsonString, HomeNewFragmentConfigEntity.ActiveConfig.class);
} catch (Exception e) {
Log.e(TAG, methodName, e);
}
return null;
}
private void finishListener(){
if (list != null && list.size() > 0) {
for (ActivityThemeChangeListener listener : list) {
listener.onActiveFinish();
}
}
}
public interface ActivityThemeChangeListener {
void onChangeTheme(HomeNewFragmentConfigEntity.ActiveConfig activeConfig);
void onActiveFinish();
}
public void addActivityThemeChangeListener(ActivityThemeChangeListener activityThemeChangeListener) {
if (activityThemeChangeListener == null) {
return;
}
if (!list.contains(activityThemeChangeListener)) {
list.add(activityThemeChangeListener);
}
}
public void removeActivityThemeChangeListener(ActivityThemeChangeListener activityThemeChangeListener) {
list.remove(activityThemeChangeListener);
}
public void clearAllListener() {
list.clear();
}
}