selector选择器的使用

本文介绍如何在Android中创建和使用Selector选择器,包括文字颜色和图片改变的选择器,通过实例展示点击底部元素时,如何实现图片和颜色的动态切换。

切换selector选择器的使用

selector选择器
一、效果

在这里插入图片描述
点击底部实现切换,底部图片和颜色跟着改变

二.如何创建选择器

1.创建文字颜色改变选择器:selector1.xml

在这里插入图片描述

在这里插入图片描述
在drawable下面直接生成selector1.xml文件,编写xml文件
在这里插入图片描述
2.创建图片改变选择器selector2.xml
在这里插入图片描述
chat1和chat2图标直接调用系统提供的,步骤如下:
(1)drawable - >new ->lmage Assert
在这里插入图片描述
(2)弹出窗体操作
在这里插入图片描述
(3)最后在drawable下面生成2个文件夹:chat1和chat2
在这里插入图片描述
3.在布局文件中直接使用
在这里插入图片描述

### Flink 中 Selector 选择器使用与实现 在 Apache Flink 中,数据流的分区策略决定了数据如何从一个算子分发到下游算子。这种分发机制由 `ChannelSelector` 接口及其实现类定义[^2]。具体来说,`ChannelSelector` 负责为每条记录选择目标通道,并决定是否需要广播数据。 #### 1. ChannelSelector 接口的核心方法 `ChannelSelector` 接口包含以下三个核心方法: - **`setup()`**:初始化下游算子的通道数量。 - **`selectChannel(SerializationDelegate<StreamRecord<T>> record)`**:为每条记录选择目标通道。 - **`isBroadcast()`**:判断是否需要将当前记录广播到所有下游任务。 这些方法的具体实现决定了数据分发的行为。 #### 2. StreamPartitioner 抽象类 `StreamPartitioner` 是 `ChannelSelector` 的抽象实现类,它封装了常见的分区逻辑。Flink 提供了多种内置的 `StreamPartitioner` 实现类,例如 `ShufflePartitioner` `BroadcastPartitioner`。 #### 3. ShufflePartitioner 示例 `ShufflePartitioner` 使用随机数生成器为每条记录选择目标通道。以下是其核心代码实现: ```java @Internal public class ShufflePartitioner<T> extends StreamPartitioner<T> { private static final long serialVersionUID = 1L; private Random random = new Random(); @Override public int selectChannel(SerializationDelegate<StreamRecord<T>> record) { // 生成 [0, numberOfChannels) 范围内的随机数 return random.nextInt(numberOfChannels); } @Override public String toString() { return "SHUFFLE"; } } ``` 在此实现中,`selectChannel` 方法通过调用 `random.nextInt(numberOfChannels)` 随机选择一个目标通道[^5]。 #### 4. BroadcastPartitioner 示例 `BroadcastPartitioner` 将每条记录广播到所有下游任务。由于广播操作不需要选择特定通道,因此其实现较为简单: ```java @Override public int selectChannel(SerializationDelegate<StreamRecord<T>> record) { throw new UnsupportedOperationException("Broadcast partitioning does not use channel selection."); } @Override public boolean isBroadcast() { return true; } ``` 在上述代码中,`selectChannel` 方法抛出异常,因为广播分区不需要选择特定通道。同时,`isBroadcast` 方法返回 `true`,表明所有记录都将被广播到所有下游任务[^4]。 #### 5. 自定义 Partitioner 用户可以通过实现 `StreamPartitioner` 接口来自定义分区逻辑。例如,以下是一个基于记录字段值进行哈希分区的自定义实现: ```java public class CustomPartitioner<T> extends StreamPartitioner<T> { private final String keyField; public CustomPartitioner(String keyField) { this.keyField = keyField; } @Override public int selectChannel(SerializationDelegate<StreamRecord<T>> record) { T value = record.getInstance().getValue(); // 假设 value 是一个 POJO 对象,且包含名为 keyField 的字段 Object keyValue = Reflect.on(value).get(keyField); if (keyValue == null) { return random.nextInt(numberOfChannels); } return Math.abs(keyValue.hashCode()) % numberOfChannels; } @Override public String toString() { return "CUSTOM"; } } ``` 在此实现中,`selectChannel` 方法根据记录中的指定字段值计算哈希值,并将其映射到目标通道[^5]。 #### 6. 并行度设置的影响 并行度的设置会影响 `ChannelSelector` 的行为。Flink 通过 `setParallelism` 方法或命令行参数 `-p` 来设置作业的并行度。并行度决定了下游任务的数量,从而影响分区逻辑的执行结果。 ### 注意事项 - 在设计自定义分区器时,需确保分区逻辑与业务需求一致。 - 广播分区会增加网络开销,应谨慎使用。 - 随机分区可能导致数据分布不均,进而影响性能。 ```python # 示例:Python API 中设置自定义分区器 from pyflink.datastream import StreamExecutionEnvironment from pyflink.common.typeinfo import Types env = StreamExecutionEnvironment.get_execution_environment() data_stream = env.from_collection([(1, 'a'), (2, 'b'), (3, 'c')], type_info=Types.TUPLE([Types.INT(), Types.STRING()])) # 设置自定义分区器 data_stream \ .rebalance() \ .partition_custom(lambda key: hash(key) % 4, lambda x: x[0]) \ .print() env.execute("Custom Partitioner Example") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值