HarmonyOS 鸿蒙Next中如何实现图片收藏功能

HarmonyOS 鸿蒙Next中如何实现图片收藏功能 我在自己的应用中需要显示图片,然后可以直接在应用中点击按钮,对图片进行收藏,收藏图片后在系统相册中图片也会显示为收藏状态

5 回复

尊敬的开发者,您好!请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。

更多关于HarmonyOS 鸿蒙Next中如何实现图片收藏功能的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


收藏夹

收藏夹属于系统相册,对图片或视频设置收藏时会自动将其加入到收藏夹中,取消收藏则会从收藏夹中移除。

获取收藏夹对象

通过PhotoAccessHelper.getAlbums接口获取收藏夹对象。

前提条件

开发步骤

  1. 设置获取收藏夹的参数为photoAccessHelper.AlbumType.SYSTEM和photoAccessHelper.AlbumSubtype.FAVORITE。
  2. 调用PhotoAccessHelper.getAlbums接口获取收藏夹对象。
import { photoAccessHelper } from '@kit.MediaLibraryKit';
async function example(phAccessHelper: photoAccessHelper.PhotoAccessHelper) {
  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.SYSTEM, photoAccessHelper.AlbumSubtype.FAVORITE);
    let album: photoAccessHelper.Album = await fetchResult.getFirstObject();
    console.info('get favorite album successfully, albumUri: ' + album.albumUri);
    fetchResult.close();
  } catch (err) {
    console.error('get favorite album failed with err: ' + err);
  }
}

1. 什么是消息队列?

消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。

消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负荷。

1.1 消息队列的作用

  • 解耦:在消息队列中,消息的生产者和消费者之间没有直接的联系,互不影响。生产者将消息发送到队列中,消费者从队列中获取消息进行处理,两者之间通过消息队列进行通信,从而实现了解耦。
  • 异步:生产者将消息发送到队列中后,不需要等待消费者处理完成,可以立即返回,继续执行其他任务。消费者在需要的时候从队列中获取消息进行处理,从而实现异步处理。
  • 削峰:当系统面临突发的高并发请求时,消息队列可以起到缓冲的作用,将请求暂时存储在队列中,然后按照系统的处理能力逐步处理,避免系统因瞬间压力过大而崩溃。
  • 可靠性:消息队列通常提供持久化机制,确保消息在传输过程中不会丢失。即使消费者暂时不可用,消息也会被保存在队列中,直到被成功处理。

1.2 消息队列的应用场景

  • 异步处理:例如用户注册后发送邮件、短信等通知,可以将发送任务放入消息队列,由后台服务异步处理,提高响应速度。
  • 应用解耦:例如订单系统和库存系统,订单系统下单后,将消息发送到队列,库存系统从队列中获取消息进行库存扣减,两个系统互不影响。
  • 流量削峰:例如秒杀活动,将大量请求先放入消息队列,然后按照系统的处理能力逐步处理,避免系统崩溃。
  • 日志处理:将日志消息发送到消息队列,由专门的日志处理服务进行收集和处理,提高系统性能。

2. 消息队列的两种模式

2.1 点对点模式

点对点模式(Point-to-Point,P2P)基于队列,消息生产者发送消息到队列,消息消费者从队列中接收消息,队列的存在使得消息的异步传输成为可能。

特点

  • 每个消息只有一个消费者,一旦被消费,消息就不再在消息队列中。
  • 生产者和消费者之间没有依赖性,生产者发送消息之后,不管有没有消费者在运行,都不会影响到生产者下次发送消息。
  • 消费者在成功接收消息之后需向队列应答成功,以便消息队列删除当前接收的消息。

2.2 发布/订阅模式

发布/订阅模式(Publish/Subscribe,Pub/Sub)定义了如何向一个内容节点发布和订阅消息,这个内容节点称为主题(Topic),主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,而消息订阅者则从主题中订阅消息。

特点

  • 每个消息可以有多个订阅者。
  • 发布者和订阅者之间有时间上的依赖性,订阅者必须保持在线状态才能接收消息。如果订阅者创建了持久订阅,那么在订阅者未连接时,消息将会保留,直到订阅者重新连接。
  • 为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

3. 常见消息队列对比

特性 RabbitMQ Apache Kafka Apache RocketMQ ActiveMQ
开发语言 Erlang Scala/Java Java Java
协议支持 AMQP、STOMP、MQTT等 自定义协议,基于TCP 自定义协议 OpenWire、STOMP、AMQP、MQTT等
持久化 支持(内存、磁盘) 支持(磁盘) 支持(磁盘) 支持(内存、磁盘、JDBC)
吞吐量 万级 十万级 十万级 万级
可用性 高(主从) 非常高(分布式) 高(主从) 高(主从)
消息延迟 微秒级 毫秒级 毫秒级 毫秒级
功能特性 并发强、性能好、延时低、社区活跃 高吞吐、分布式、持久化、容错性好 高吞吐、低延迟、高可用、事务消息 功能完备、支持多种协议、易于使用
适用场景 对吞吐量要求不是特别高,需要高稳定性和易用性的场景 日志收集、大数据处理、流式数据处理 金融、电商等对一致性要求较高的场景 中小型企业应用,需要多种协议支持

4. 消息队列选型建议

  • RabbitMQ:如果你的系统需要高稳定性和易用性,对吞吐量的要求不是特别高(万级),且需要支持多种协议,RabbitMQ是一个不错的选择。
  • Kafka:如果你需要处理海量数据(日志收集、大数据处理),并且需要高吞吐量(十万级甚至百万级),Kafka是最佳选择。
  • RocketMQ:如果你的业务场景对消息的顺序一致性、可靠性要求非常高(如金融、电商交易),且需要高吞吐量,可以考虑RocketMQ。
  • ActiveMQ:如果你的系统是中小型企业应用,需要快速上手且支持多种协议,ActiveMQ是一个成熟稳定的选择。

5. 总结

消息队列是现代分布式系统中不可或缺的组件,它通过解耦、异步、削峰和可靠性保证,提高了系统的可扩展性、可靠性和性能。在选择消息队列时,需要根据具体的业务需求、吞吐量要求、功能特性和团队技术栈进行综合考虑。

在HarmonyOS Next中,实现图片收藏功能主要使用ArkUI框架和本地数据管理。通过PixelMap处理图片,使用媒体库管理模块(@ohos.file.photoAccessHelper)访问系统相册。收藏状态通常通过Preferences或关系型数据库存储。界面可使用Grid组件展示图片,结合Image组件和状态变量控制收藏图标显示。关键步骤包括获取图片URI、切换收藏状态并持久化存储。

在HarmonyOS Next中实现图片收藏功能,需要结合媒体库管理和用户交互。核心是使用@ohos.file.photoAccessHelper@ohos.file.userFileManager模块。

主要步骤:

  1. 获取图片资源:使用photoAccessHelper.getPhotoAccessHelper()获取助手对象,通过查询条件获取目标图片的PhotoAsset对象。

  2. 修改收藏状态:调用PhotoAsset.favorite()方法将图片标记为收藏。收藏状态会同步到系统相册。

  3. 权限声明:在module.json5中声明必要权限:

{
  "requestPermissions": [
    {
      "name": "ohos.permission.READ_IMAGEVIDEO",
      "reason": "$string:reason"
    },
    {
      "name": "ohos.permission.WRITE_IMAGEVIDEO", 
      "reason": "$string:reason"
    }
  ]
}
  1. UI交互:在界面中设置收藏按钮,点击时触发收藏操作,并更新按钮状态。

关键代码示例:

import photoAccessHelper from '@ohos.file.photoAccessHelper';

// 获取PhotoAsset对象后
async function favoriteImage(photoAsset: photoAccessHelper.PhotoAsset) {
  try {
    await photoAsset.favorite(true); // true表示收藏
    console.log('图片收藏成功');
  } catch (err) {
    console.error(`收藏失败: ${err.code}, ${err.message}`);
  }
}

注意:首次使用需要动态申请存储权限,确保用户授权后才能修改图片元数据。收藏状态修改后,系统相册会立即同步显示。

回到顶部