groovy Ip地址表达式

本文介绍了一个用于检测IP地址变化并记录的脚本。通过正则表达式从特定网站抓取IP地址,若发现IP地址发生变化,则发送邮件通知。此脚本适用于需要监控IP地址变动的场景。

 

currentIp = ( "http://whatsmyip.us/" .toURL().text =~ /\b\d{ 1 , 3 }\.\d{ 1 , 3 }\.\d{ 1 , 3 }\.\d{ 1 , 3 }\b/)[ 0 ]
 
println currentIp
 
def ipLog = new File( "ip-log.txt" )
 
recentIp = ipLog.readLines().last(). tokenize ( "," ).last().trim()
 
if (currentIp != recentIp) {
   Mailer.deliverIpAddressChangeMessage currentIp
   println "IP Address has changed, it is now: ${currentIp}. Sending Message."
<think>我们正在处理一个Android开发中的问题:switch语句中提示"Constant expression required" 原因分析:在Java的switch语句中,case标签必须是编译时常量(如枚举常量、字面量或final变量)。在Android中,当使用资源ID(如R.id.open)时,它们实际上是非final的int值(尽管在编译时生成,但Java编译器不将其视为编译时常量)。 解决方案: 1. 改为使用if-else结构(推荐,因为资源ID本身不是编译时常量,且资源ID在library项目中可能不是final的) 2. 在模块的build.gradle中启用资源ID常量优化(适用于较新的Android Gradle Plugin,但注意兼容性) 具体修改示例: 原代码: ``` @Override public void onClick(View view) { switch (view.getId()) { case R.id.open: ... break; ... } } ``` 修改为if-else结构: ``` @Override public void onClick(View view) { int id = view.getId(); if (id == R.id.open) { ethernetMain.openEth(); } else if (id == R.id.close) { ethernetMain.closeEth(); } else if (id == R.id.dhcp_button) { ethernetMain.dhcpEth(); } else if (id == R.id.static_button) { setStaticIP(); } } ``` 为什么资源ID不是编译时常量? 在Android库项目中,资源ID在R.java中定义为public static int,但不是final(因为多个库项目合并时可能会改变值)。因此,在switch语句中使用会导致编译错误。 替代方案(不常用): 在模块的build.gradle中使用以下配置(适用于AGP 3.0+),但注意这仅对当前模块有效,且不适用于库模块: ```groovy android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } } ``` 注意:从AGP 4.0开始,资源ID在非库模块中会被标记为final,因此可以直接在switch中使用。但为了兼容性,仍推荐使用if-else。 因此,根据提示,最简单的解决方案是将switch改为if-else结构。 下面我们提供修改后的代码: </think>### Android View 点击事件中 "Constant expression required" 错误解析 您遇到的 `Constant expression required` 错误是因为在 Java 的 `switch` 语句中,`case` 标签必须使用**编译时常量**(compile-time constant)。在 Android 中,资源 ID(如 `R.id.open`)虽然看起来是常量,但在编译过程中实际上被处理为非常量值。 #### 根本原因分析: 1. **资源 ID 特性**:Android 资源 ID 在 `R.java` 中定义为 `public static int`,但**不是 `final`** 类型 2. **编译器限制**:Java 要求 `switch` 的 `case` 表达式必须是编译时可确定的常量值 3. **资源系统机制**:资源 ID 会在构建时动态生成,编译阶段无法确定其具体值 #### 解决方案: ##### 方案 1:改用 if-else 结构(推荐) ```java @Override public void onClick(View view) { int id = view.getId(); if (id == R.id.open) { ethernetMain.openEth(); } else if (id == R.id.close) { ethernetMain.closeEth(); } else if (id == R.id.dhcp_button) { ethernetMain.dhcpEth(); } else if (id == R.id.static_button) { setStaticIP(); } } ``` ##### 方案 2:启用资源 ID 常量优化(适用于 AGP 3.0+) 在模块的 `build.gradle` 中添加: ```groovy android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } } ``` ##### 方案 3:使用注解库优化 添加 ButterKnife 或 ViewBinding: ```gradle dependencies { implementation 'com.jakewharton:butterknife:10.2.3' annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' } ``` #### 各方案对比: | 方案 | 优点 | 缺点 | 适用场景 | |------|------|------|----------| | if-else | 无需配置,兼容性好 | 代码略显冗长 | 所有项目 | | 资源优化 | 保留 switch 结构 | 需 AGP 3.0+ | 新项目 | | 注解库 | 减少样板代码 | 增加依赖 | 大型项目 | **最佳实践**:在 `onClick` 方法中优先使用 `if-else` 结构,既避免编译错误,又保持代码清晰可读。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值