渲染卡片

本文介绍了在 Android 客户端渲染卡片的整体实现流程。

渲染卡片的流程分为四部分,第一步,组装卡片配置信息;第二步,根据配置信息请求卡片,获取到卡片实例;第三步,通过卡片实例,使用卡片 View 去渲染;第四步,在整个业务完成后,在 destroy声明周期中,释放卡片。具体流程如下:

  1. 组装卡片配置信息。

    创建配置信息,并设置各种参数。更多参数请参见 接口说明

    /**
     * 组装卡片配置信息
     * @return
     */
    private CubeCardConfig assembleCubeCardConfig(){
        // 创建卡片配置
        CubeCardConfig cardConfig = new CubeCardConfig();
        // 后台创建的卡片ID
        cardConfig.setTemplateId("hello_cube");
        // 卡片版本
        cardConfig.setVersion("1.0.0.0");
        // 卡片宽度,这里选取屏幕宽度
        cardConfig.setWidth(MFSystemInfo.getPortraitScreenWidth());
        return cardConfig;
    }
  2. 请求卡片。

    根据组装好的卡片配置信息,请求卡片。卡片引擎会去服务端获取卡片模板信息,可以使用 createCard方法一次请求一个卡片,也可以使用 createCards方法一次请求多个卡片。

    /**
     * 请求卡片信息
     * @param cardConfig
     */
    private void requestCubeCard(final CubeCardConfig cardConfig){
        // 创建卡片信息
        CubeService.instance().getEngine().createCard(cardConfig, new CCardCallback() {
            @Override
            public void onLoaded(final CubeCard cubeCard, CCardType cardType, CubeCardConfig cubeCardConfig, CubeCardResultCode resultCode) {
                renderCubeCard(cubeCard,cardType,cubeCardConfig,resultCode);
            }
        });
    }
  3. 渲染卡片。

    获取到卡片信息后,生成卡片 View,在主线程中进行渲染。这一步也要做异常判断,防止未顺利获取到卡片信息的情况发生。

    /**
     * 渲染卡片
     * @param cubeCard
     * @param cardType
     * @param cubeCardConfig
     * @param resultCode
     */
    private void renderCubeCard(final CubeCard cubeCard, CCardType cardType, CubeCardConfig cubeCardConfig, CubeCardResultCode resultCode) {
        if (resultCode == CubeCardResultCode.CubeCardResultSucc) {
            // 需要运行在主线程
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mCard = cubeCard;
                    // 创建卡片View
                    CubeView view = CubeService.instance().getEngine().createView(FastActivity.this);
                    // 添加到外层 ViewGroup 里
                    mWrapperLl.addView(view);
                    // 渲染卡片
                    cubeCard.renderView(view);
                }
            });
            MPLogger.info(TAG, "succ " + cubeCardConfig.getTemplateId() + " style " + cardType);
        } else {
            MPLogger.info(TAG, "fail " + cubeCardConfig.getTemplateId() + " style " + cardType + " error " + resultCode);
        }
    }
  4. 释放卡片。

    卡片使用完成之后,释放卡片的内存资源,通常是在页面的 onDestroy生命周期里调用。

    /**
     * 释放卡片资源
     */
    private void releaseCubeCard(){
        if (mCard != null) {
            mCard.recycle();
        }
        int chidrenCount = mWrapperLl.getChildCount();
        for (int i = 0; i < chidrenCount; i++) {
            if (mWrapperLl.getChildAt(i) instanceof CubeView) {
                ((CubeView) mWrapperLl.getChildAt(i)).destroy();
            }
        }
        mWrapperLl.removeAllViews();
    }