本文介绍了在 Android 客户端渲染卡片的整体实现流程。
渲染卡片的流程分为四部分,第一步,组装卡片配置信息;第二步,根据配置信息请求卡片,获取到卡片实例;第三步,通过卡片实例,使用卡片 View 去渲染;第四步,在整个业务完成后,在 destroy
声明周期中,释放卡片。具体流程如下:
组装卡片配置信息。
创建配置信息,并设置各种参数。更多参数请参见 接口说明。
/** * 组装卡片配置信息 * @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; }
请求卡片。
根据组装好的卡片配置信息,请求卡片。卡片引擎会去服务端获取卡片模板信息,可以使用
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); } }); }
渲染卡片。
获取到卡片信息后,生成卡片 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); } }
释放卡片。
卡片使用完成之后,释放卡片的内存资源,通常是在页面的
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(); }
文档内容是否对您有帮助?