当前位置: 首页 > news >正文

鸿蒙多功能工具箱开发实战(十六)-实时行情数据获取与展示

鸿蒙多功能工具箱开发实战(十六)-实时行情数据获取与展示

前言

实时行情数据展示需要网络请求和数据刷新机制。本文将讲解HarmonyOS网络请求API和行情数据展示的实现。

一、网络请求封装

1.1 HTTP服务封装

importhttpfrom'@ohos.net.http'exportclassHttpService{privatestaticinstance:HttpServiceprivatehttpClient:http.HttpClientprivateconstructor(){this.httpClient=http.createHttp()}staticgetInstance():HttpService{if(!HttpService.instance){HttpService.instance=newHttpService()}returnHttpService.instance}/** * GET请求 */asyncget<T>(url:string,params?:Record<string,string>):Promise<T>{constfullUrl=params?`${url}?${this.stringifyParams(params)}`:urlreturnnewPromise((resolve,reject)=>{this.httpClient.request(fullUrl,{method:http.RequestMethod.GET,header:{'Content-Type':'application/json'},connectTimeout:60000,readTimeout:60000},(err,data)=>{if(err){reject(err)}else{try{constresult=JSON.parse(data.resultasstring)asTresolve(result)}catch(e){reject(e)}}})})}privatestringifyParams(params:Record<string,string>):string{returnObject.entries(params).map(([k,v])=>`${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join('&')}}

1.2 行情数据接口

exportinterfaceGoldPrice{date:stringprice:numberchange:numberchangePercent:number}exportinterfaceExchangeRate{from:stringto:stringrate:numberupdateTime:string}exportclassMarketService{privatehttp=HttpService.getInstance()/** * 获取今日金价 */asyncgetGoldPrice():Promise<GoldPrice>{// 模拟数据(实际应调用真实API)return{date:newDate().toLocaleDateString(),price:580.50,change:2.30,changePercent:0.40}}/** * 获取实时汇率 */asyncgetExchangeRates():Promise<ExchangeRate[]>{// 模拟数据return[{from:'USD',to:'CNY',rate:7.2456,updateTime:newDate().toLocaleString()},{from:'EUR',to:'CNY',rate:7.8912,updateTime:newDate().toLocaleString()},{from:'GBP',to:'CNY',rate:9.1234,updateTime:newDate().toLocaleString()},{from:'JPY',to:'CNY',rate:0.0482,updateTime:newDate().toLocaleString()}]}}

二、数据刷新机制

2.1 定时刷新

@Componentstruct MarketPage{@StategoldPrice:GoldPrice=null@StateexchangeRates:ExchangeRate[]=[]@StateisLoading:boolean=false@StatelastUpdate:string=''privatemarketService=newMarketService()privaterefreshInterval:number=nullaboutToAppear(){this.loadData()// 每30秒刷新一次this.refreshInterval=setInterval(()=>{this.loadData()},30000)}aboutToDisappear(){if(this.refreshInterval){clearInterval(this.refreshInterval)}}asyncloadData(){this.isLoading=truetry{this.goldPrice=awaitthis.marketService.getGoldPrice()this.exchangeRates=awaitthis.marketService.getExchangeRates()this.lastUpdate=newDate().toLocaleTimeString()}catch(e){console.error('加载数据失败:',e)}finally{this.isLoading=false}}build(){Column(){NavBar({title:'实时行情'})// 下拉刷新Refresh({refreshing:$$this.isLoading}){Column(){// 金价展示this.GoldPriceCard()// 汇率列表this.ExchangeRateList()// 更新时间Text(`最后更新:${this.lastUpdate}`).fontSize(12).fontColor('#999999').margin({top:16})}}.onRefreshing(()=>{this.loadData()})}}@BuilderGoldPriceCard(){Column(){Row(){Text('今日金价').fontSize(16)Text(this.goldPrice?.date||'').fontSize(12).fontColor('#999999')}.width('100%').justifyContent(FlexAlign.SpaceBetween)Text(`¥${this.goldPrice?.price?.toFixed(2)||'--'}`).fontSize(36).fontWeight(FontWeight.Bold).margin({top:16})Row(){Text(`${this.goldPrice?.change>0?'+':''}${this.goldPrice?.change?.toFixed(2)||'--'}`).fontColor(this.goldPrice?.change>0?'#E74C3C':'#27AE60')Text(`(${this.goldPrice?.changePercent?.toFixed(2)}%)`).fontColor(this.goldPrice?.change>0?'#E74C3C':'#27AE60')}.margin({top:8})}.width('90%').padding(24).backgroundColor('#FFFFFF').borderRadius(12).margin({top:16})}}

三、高级功能

3.1 数据流程图

发起HTTP请求

接收响应数据

解析JSON

数据验证

数据有效?

更新UI状态

显示错误信息

启动定时器

等待刷新

3.2 错误处理

classQuoteService{privatestaticMAX_RETRY=3privatestaticretryCount=0staticasyncfetchWithRetry(url:string):Promise<QuoteData>{try{constresponse=awaithttp.request(url)this.retryCount=0returnthis.parseResponse(response)}catch(error){this.retryCount++if(this.retryCount<this.MAX_RETRY){awaitthis.delay(1000*this.retryCount)returnthis.fetchWithRetry(url)}thrownewError('数据获取失败')}}}

3.3 数据缓存

classQuoteCache{privatestaticcache:Map<string,{data:QuoteData,time:number}>=newMap()privatestaticTTL=30000// 30秒staticget(key:string):QuoteData|null{constitem=this.cache.get(key)if(!item)returnnullif(Date.now()-item.time>this.TTL){this.cache.delete(key)returnnull}returnitem.data}staticset(key:string,data:QuoteData){this.cache.set(key,{data,time:Date.now()})}}

四、界面优化

4.1 行情卡片

@Componentstruct QuoteCard{@Propquote:QuoteDatabuild(){Column(){Row(){Text(this.quote.name).fontSize(16)Blank()Text(this.quote.code).fontSize(12).fontColor('#999')}Row(){Text(`¥${this.quote.price.toFixed(2)}`).fontSize(24).fontColor(this.quote.change>=0?'#E74C3C':'#27AE60')Text(`${this.quote.change>=0?'+':''}${this.quote.changePercent.toFixed(2)}%`).fontColor(this.quote.change>=0?'#E74C3C':'#27AE60')}.margin({top:8})}.padding(16).backgroundColor('#FFF').borderRadius(8)}}

图 1 今日金价界面展示

五、单元测试

describe('QuoteService',()=>{it('should fetch quote data',async()=>{constdata=awaitQuoteService.fetch('000001')expect(data.price).toBeGreaterThan(0)})})

六、小结

本文详细讲解了实时行情功能:

  1. ✅ HTTP请求封装
  2. ✅ 行情数据接口
  3. ✅ 定时刷新机制
  4. ✅ 下拉刷新
  5. ✅ 数据展示
  6. ✅ 错误处理
  7. ✅ 数据缓存
  8. ✅ 单元测试

系列文章导航
下期预告:鸿蒙多功能工具箱开发实战(十七)-每日语录与天气查询

http://www.jsqmd.com/news/1256611/

相关文章:

  • 语音变压器能做到20Hz到20kHz吗?
  • 如何在5分钟内为AI-Shoujo安装HF补丁:完整游戏增强与模组整合指南
  • 10分钟快速上手:鸣潮智能自动化工具完全指南
  • AMD Ryzen调试神器:SMUDebugTool深度使用与性能优化完全指南
  • 还在用单点AI工具?:真正专业的程序员套装必须满足这5个硬性指标(附性能压测对比数据)
  • Beyond Compare 5企业级激活实战:一键生成永久授权码的完整解决方案
  • 2026终极测评:16款降AIGC工具横评,论文降重降ai率终极答案! - 降AI小能手
  • 单细胞测序数据分析入门:从数据获取到基础分析
  • 如何免费突破百度网盘限速:完整解析工具使用指南
  • 【解决方案】构建零成本AI股票分析系统:GitHub Actions自动化部署实战方案
  • 纯血鸿蒙诞生、大模型降价、《黑神话·悟空》全球成功……属于我们共同的关键瞬间 | 融云 2024 年回顾
  • FreeBSD Podman 安装与 GPT4Free 容器部署指南 by Trae
  • 如何5分钟搞定原神抽卡记录导出:零基础玩家的完整实战指南
  • OpenRPA终极指南:如何免费实现企业级自动化,告别百万软件成本
  • HarmonyOS7 SVG 与图标:SymbolGlyph + 自定义 SVG 图标库搭建
  • OnmyojiAutoScript:阴阳师自动化脚本终极指南,解放双手的智能助手
  • Nintendo Switch大气层系统完全指南:从零开始打造你的终极游戏体验
  • AirPodsDesktop终极指南:在Windows电脑上完美使用苹果AirPods的完整解决方案
  • 从零实现C++ Vector:深入理解动态数组、RAII与迭代器失效
  • 【MAI Gateway | AI网关】一个 30 秒的AI视频,四个工位看到的是四件不同的事
  • 5个简单技巧:用ScriptCat脚本猫彻底改变你的浏览器使用习惯
  • 多模态AI模型技术解析与工程实践
  • 2026深圳线下心理咨询机构综合实力权威评测排行|合规资质服务实力精细化梳理+FAQ - 互联网科技品牌测评
  • WebSocket 跨站劫持(CSWSH)漏洞原理与 PortSwigger Lab 实战
  • Day 02 · 环境搭建:一套装备打天下
  • 终极免费A股智能分析工具:基于AI大模型的零成本投资决策系统
  • 实测对比!上海4家黄金回收高口碑门店,优劣差异一目了然 - 日常比对手册
  • 如何快速掌握AI投资分析:零基础实战指南
  • VSCode安装PlatformIO IDE环境(ESP32)
  • windows网络适配器驱动开发-开发 WiFiCx 客户端驱动程序(四)