本文介紹了在 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(); }
文檔內容是否對您有幫助?