HarmonyOS 鸿蒙Next中如何实现图片收藏功能
HarmonyOS 鸿蒙Next中如何实现图片收藏功能 我在自己的应用中需要显示图片,然后可以直接在应用中点击按钮,对图片进行收藏,收藏图片后在系统相册中图片也会显示为收藏状态
尊敬的开发者,您好!请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。
更多关于HarmonyOS 鸿蒙Next中如何实现图片收藏功能的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
收藏夹
收藏夹属于系统相册,对图片或视频设置收藏时会自动将其加入到收藏夹中,取消收藏则会从收藏夹中移除。
获取收藏夹对象
通过PhotoAccessHelper.getAlbums接口获取收藏夹对象。
前提条件
- 获取相册管理模块photoAccessHelper实例。
- 申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’。
开发步骤
- 设置获取收藏夹的参数为photoAccessHelper.AlbumType.SYSTEM和photoAccessHelper.AlbumSubtype.FAVORITE。
- 调用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模块。
主要步骤:
-
获取图片资源:使用
photoAccessHelper.getPhotoAccessHelper()获取助手对象,通过查询条件获取目标图片的PhotoAsset对象。 -
修改收藏状态:调用
PhotoAsset.favorite()方法将图片标记为收藏。收藏状态会同步到系统相册。 -
权限声明:在
module.json5中声明必要权限:
{
"requestPermissions": [
{
"name": "ohos.permission.READ_IMAGEVIDEO",
"reason": "$string:reason"
},
{
"name": "ohos.permission.WRITE_IMAGEVIDEO",
"reason": "$string:reason"
}
]
}
- 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}`);
}
}
注意:首次使用需要动态申请存储权限,确保用户授权后才能修改图片元数据。收藏状态修改后,系统相册会立即同步显示。

