Android C端活动业务管理设计与思考

本文探讨了现有的活动管理零散问题,提出通过ActivityManager模块集中管理活动,包括接口请求、数据缓存、API提供和活动事件分发。以6.4.8版本为例,详细介绍了如何使用这个模块解决样式同步与一致性问题,预示未来活动复杂性的管理趋势。
摘要由CSDN通过智能技术生成

在这里插入图片描述
背景:

    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();
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值