整理自项目模拟面试,覆盖 AI 生图任务链路、AI 写真素材上传、Firebase Storage 与 CDN 图片加载、图片压缩、订阅与积分购买、订阅有效性校验与项目难点
参数组装 -> 创建生成任务 -> 轮询状态 -> 结果落库 -> 页面与历史记录更新。job_idjob_id 轮询结果ArtsActivityDrawParameterArtGenerateLauncher.generate(...)ArtGenerateLauncher 不只是发请求ArtTaskMgr.registerTask(...)ArtTaskMgr.send(...)ArtTaskMgr 会把一次生成抽象成 ArtTaskEntityfromparametertask_typetask_server_idtask_statustask_fail_typeimage_urls/image/sd/txt2img/image/sd/imgjob_idjob_id 轮询结果ArtDataSource.queryNet(...) 负责轮询faceUploaded 标记素材是否已经准备好PhotosParameter 主要传:style_idpose_idis_prois_freeuse_creditSERVER_STORAGE_EMPTYfaceUploaded 置回 falsethirdlib.compressor.CompressorFaceUploadManager 里:maxResolution(720)format(Bitmap.CompressFormat.WEBP, 90)FilterUploadManager 里:maxResolution(1024)format(Bitmap.CompressFormat.WEBP, 90)storagePathstoragePath 拼成 CDN 地址loadStorageloadStorageBitmapcacheStoragecacheStorageIntoSingleFirebaseImageLoaderload(StorageReference)ModelLoaderMyAppGlideModule 把 StorageReference -> InputStream 的加载能力接进 GlideSingleFirebaseImageLoaderEmptyViewTargetCallbackFutureTargetFutureTargetsubmit().get() 这种阻塞式取结果时,仍然能触发失败监听RequestListenerCDNImageRequestListenerloadStorage / loadStorageBitmap / cacheStorage,就天然带上打点path:图片路径from:请求来源displaydownloadcacheprecachetype:图片类型aiphotostext2artfaceothersuccess:是否成功error:错误类型onResourceReady 中dataSource == REMOTE 的远端成功请求onLoadFailed 中timeouthttp-error_xxximg-corruptedotherBillingWrapper 注册、查询商品详情并发起购买SubsPurchaseModeladdOrder(...) 做订单绑定hasBoundVipwiseart_credit_10InAppPurchaseModeladdCredit(...)UsageSp.updateCredit(...) 更新本地余额is_pro = trueuse_credit = trueUsageSp 的 usageCountGoogle Play 有效订阅 + 服务端已绑定 VIP 两边同时成立,才认为用户是真正的会员SubsPurchaseModelexpireTime 最大的一条GP VIPhasBoundVipis_proexpireTimeBillingSp.expiressetExpireTimeUpdated(orderId, expireTime)recoverVip() 重新绑定