From 7d2c827a2f6fade51772b74ac494180398c5879f Mon Sep 17 00:00:00 2001 From: luo <1103934424@qq.com> Date: Mon, 12 Aug 2024 23:57:48 +0800 Subject: [PATCH] Site updated: 2024-08-12 23:57:47 --- .../Android Notification blog two/index.html | 2 +- .../03/NullPointException Analysis/index.html | 4 +- 2014/11/04/butterknife-useing/index.html | 6 +- 2014/11/04/eclipse-shutdown/index.html | 6 +- 2014/11/05/google volley retry/index.html | 4 +- .../23/google-volley-url-cache-key/index.html | 2 +- 2015/04/05/keystore-file-options/index.html | 2 +- .../06/android-snippet-sdcard-size/index.html | 4 +- .../06/android-string-xml-format/index.html | 6 +- 2015/04/06/define-id-in-xml-file/index.html | 2 +- .../exit-app-by-press-twice-back/index.html | 6 +- 2015/04/06/format-file-size/index.html | 4 +- 2015/04/06/gradle-rename-apk-file/index.html | 6 +- 2015/04/06/text-color-selector/index.html | 6 +- 2023/07/11/r8-unoffcial-document/index.html | 2 +- .../index.html | 4 +- .../09/android-jdk-configuration/index.html | 980 ++++++++++++++++++ .../09/java-function-patten-study/index.html | 20 +- archives/2014/11/index.html | 8 +- archives/2014/index.html | 8 +- archives/2015/04/page/2/index.html | 24 +- archives/2015/page/3/index.html | 24 +- archives/2023/index.html | 28 +- archives/{2023 => 2024}/08/index.html | 20 +- archives/{2023/page/2 => 2024}/index.html | 26 +- archives/index.html | 28 +- archives/page/10/index.html | 8 + archives/page/2/index.html | 16 +- archives/page/3/index.html | 16 +- archives/page/4/index.html | 16 +- archives/page/5/index.html | 16 +- archives/page/6/index.html | 32 +- archives/page/7/index.html | 16 +- archives/page/8/index.html | 16 +- archives/page/9/index.html | 16 +- categories/Java/index.html | 14 +- .../\345\256\211\345\215\223/index.html" | 6 +- index.html | 49 +- page/10/index.html | 17 + page/2/index.html | 30 +- page/3/index.html | 28 +- page/4/index.html | 36 +- page/5/index.html | 25 +- page/6/index.html | 22 +- page/7/index.html | 36 +- page/8/index.html | 37 +- page/9/index.html | 37 +- snippet/index.html | 106 +- tags/Android-Proguard/index.html | 8 +- tags/Android/index.html | 6 +- tags/Java/index.html | 14 +- 51 files changed, 1442 insertions(+), 413 deletions(-) rename {2023 => 2024}/08/01/android-targetsdk-compilesdk-minsdk copy/index.html (99%) create mode 100644 2024/08/09/android-jdk-configuration/index.html rename {2023 => 2024}/08/09/java-function-patten-study/index.html (93%) rename archives/{2023 => 2024}/08/index.html (95%) rename archives/{2023/page/2 => 2024}/index.html (92%) diff --git a/2014/10/12/Android Notification blog two/index.html b/2014/10/12/Android Notification blog two/index.html index a07e13ed..8de84898 100644 --- a/2014/10/12/Android Notification blog two/index.html +++ b/2014/10/12/Android Notification blog two/index.html @@ -747,7 +747,7 @@

和上一个例子不同的是,这一个Notification跳转的位置并不是OtherActiivty
而是直接跳转到MainActivity.

-

问题
非常不幸的事,他并不能够正常接收么Intent传过来的参数。至于为什么,我也不知道。
如您知道这个的具体原因请告知我(邮箱:lovecluo@gmail.com)。

+

问题
非常不幸的事,他并不能够正常接收么Intent传过来的参数。至于为什么,我也不知道。
如您知道这个的具体原因请告知我(邮箱:lovecluo@gmail.com)。

解决办法

虽然不知道是什么原因造成了这个问题,但是最终还是找到了解决方案:

解决方法如下:

diff --git a/2014/11/03/NullPointException Analysis/index.html b/2014/11/03/NullPointException Analysis/index.html index 3f8dfa87..924f7a30 100644 --- a/2014/11/03/NullPointException Analysis/index.html +++ b/2014/11/03/NullPointException Analysis/index.html @@ -787,7 +787,7 @@

解决 B constructor method excute

总结

这一次的空指针的最根本原因是在父类的构造方法中执行了子类实例变量的初始化
操作,这是一个非常不合理的举动。如果子类属性中的东西应该在子类中进行初始化,
而不是在父类中调用初始化方法。

-

写在最后

代码木有上传上来,如果你想看看这个丑陋的代码是怎么写的,你可以邮件联系我:
lovecluo@nightweaver.org

+

写在最后

代码木有上传上来,如果你想看看这个丑陋的代码是怎么写的,你可以邮件联系我:
lovecluo@nightweaver.org

更新代码地址:

  • Bug版代码
  • @@ -812,7 +812,7 @@

    写在
    - 上一篇: Ubuntu-14.04下Eclipse闪退解决办法 + 上一篇: Andorid UI注入工具的使用(ButterKnife)
    diff --git a/2014/11/04/butterknife-useing/index.html b/2014/11/04/butterknife-useing/index.html index ebd71850..68516e31 100644 --- a/2014/11/04/butterknife-useing/index.html +++ b/2014/11/04/butterknife-useing/index.html @@ -823,12 +823,12 @@

    参考
    - 上一篇: Google Volley 网络请求框架(一) + 上一篇: Ubuntu-14.04下Eclipse闪退解决办法
    - 下一篇: - Ubuntu-14.04下Eclipse闪退解决办法 + 下一篇: + Android 项目中出现的奇葩bug, 数据NullPointExcption
    diff --git a/2014/11/04/eclipse-shutdown/index.html b/2014/11/04/eclipse-shutdown/index.html index 5db5b714..272cd16c 100644 --- a/2014/11/04/eclipse-shutdown/index.html +++ b/2014/11/04/eclipse-shutdown/index.html @@ -886,12 +886,12 @@

    参考
    - 上一篇: Andorid UI注入工具的使用(ButterKnife) + 上一篇: Google Volley 网络请求框架(一)
    - 下一篇: - Android 项目中出现的奇葩bug, 数据NullPointExcption + 下一篇: + Andorid UI注入工具的使用(ButterKnife)
    diff --git a/2014/11/05/google volley retry/index.html b/2014/11/05/google volley retry/index.html index 7b710050..161ad304 100644 --- a/2014/11/05/google volley retry/index.html +++ b/2014/11/05/google volley retry/index.html @@ -897,8 +897,8 @@

    写在

    - 下一篇: - Andorid UI注入工具的使用(ButterKnife) + 下一篇: + Ubuntu-14.04下Eclipse闪退解决办法 diff --git a/2015/01/23/google-volley-url-cache-key/index.html b/2015/01/23/google-volley-url-cache-key/index.html index c1d14fea..d300ecbb 100644 --- a/2015/01/23/google-volley-url-cache-key/index.html +++ b/2015/01/23/google-volley-url-cache-key/index.html @@ -1043,7 +1043,7 @@

    想法<

    就是HttpHeaderParser.parseCacheHeaders(response)实现ResponseCache.Entry的转换。

    当然,你可以实现自己的parseCacheHeaders的方法,来实现你自己的缓存侧略。

    -

    到此为止,基本写完了我所读到的Volley中实现Cache的方法。如果你对本文或者我有什么意见或者建议。
    请骚扰我:lovecluo@nightweaver.org

    +

    到此为止,基本写完了我所读到的Volley中实现Cache的方法。如果你对本文或者我有什么意见或者建议。
    请骚扰我:lovecluo@nightweaver.org


    diff --git a/2015/04/05/keystore-file-options/index.html b/2015/04/05/keystore-file-options/index.html index 5ead6bc8..d2f4fd47 100644 --- a/2015/04/05/keystore-file-options/index.html +++ b/2015/04/05/keystore-file-options/index.html @@ -744,7 +744,7 @@

    目录

    - 上一篇: Android文字颜色选择器 + 上一篇: gradle打包的时候,自动重命名APK文件
    diff --git a/2015/04/06/android-snippet-sdcard-size/index.html b/2015/04/06/android-snippet-sdcard-size/index.html index 79aa2f4e..6308f14f 100644 --- a/2015/04/06/android-snippet-sdcard-size/index.html +++ b/2015/04/06/android-snippet-sdcard-size/index.html @@ -746,8 +746,8 @@

    目录

    - 下一篇: - Android string.xml中的占位符 + 下一篇: + 在`values`中定义id diff --git a/2015/04/06/android-string-xml-format/index.html b/2015/04/06/android-string-xml-format/index.html index a205a1ff..c63dc986 100644 --- a/2015/04/06/android-string-xml-format/index.html +++ b/2015/04/06/android-string-xml-format/index.html @@ -739,12 +739,12 @@

    目录

    - 上一篇: SD Card的大小和容量 + 上一篇: Android 按两次返回键退出应用程序
    - 下一篇: - 在`values`中定义id + 下一篇: + Android文字颜色选择器
    diff --git a/2015/04/06/define-id-in-xml-file/index.html b/2015/04/06/define-id-in-xml-file/index.html index 1da49116..d1a5217b 100644 --- a/2015/04/06/define-id-in-xml-file/index.html +++ b/2015/04/06/define-id-in-xml-file/index.html @@ -743,7 +743,7 @@

    目录

    - 上一篇: Android string.xml中的占位符 + 上一篇: SD Card的大小和容量
    diff --git a/2015/04/06/exit-app-by-press-twice-back/index.html b/2015/04/06/exit-app-by-press-twice-back/index.html index bb0e2548..e0233fbb 100644 --- a/2015/04/06/exit-app-by-press-twice-back/index.html +++ b/2015/04/06/exit-app-by-press-twice-back/index.html @@ -751,12 +751,12 @@

    目录

    - 上一篇: gradle打包的时候,自动重命名APK文件 + 上一篇: 格式化文件容量代码
    - 下一篇: - Android文字颜色选择器 + 下一篇: + Android string.xml中的占位符
    diff --git a/2015/04/06/format-file-size/index.html b/2015/04/06/format-file-size/index.html index ec0bbde2..dd868fa9 100644 --- a/2015/04/06/format-file-size/index.html +++ b/2015/04/06/format-file-size/index.html @@ -752,8 +752,8 @@

    目录

    - 下一篇: - gradle打包的时候,自动重命名APK文件 + 下一篇: + Android 按两次返回键退出应用程序 diff --git a/2015/04/06/gradle-rename-apk-file/index.html b/2015/04/06/gradle-rename-apk-file/index.html index f3145250..1cc7d7ed 100644 --- a/2015/04/06/gradle-rename-apk-file/index.html +++ b/2015/04/06/gradle-rename-apk-file/index.html @@ -746,12 +746,12 @@

    目录

    - 上一篇: 格式化文件容量代码 + 上一篇: Android文字颜色选择器
    - 下一篇: - Android 按两次返回键退出应用程序 + 下一篇: + Android Keystore 文件的密码修改
    diff --git a/2015/04/06/text-color-selector/index.html b/2015/04/06/text-color-selector/index.html index cdf9cdfd..32d41fa6 100644 --- a/2015/04/06/text-color-selector/index.html +++ b/2015/04/06/text-color-selector/index.html @@ -746,12 +746,12 @@

    目录

    - 上一篇: Android 按两次返回键退出应用程序 + 上一篇: Android string.xml中的占位符
    - 下一篇: - Android Keystore 文件的密码修改 + 下一篇: + gradle打包的时候,自动重命名APK文件
    diff --git a/2023/07/11/r8-unoffcial-document/index.html b/2023/07/11/r8-unoffcial-document/index.html index 0093347b..55251f7a 100644 --- a/2023/07/11/r8-unoffcial-document/index.html +++ b/2023/07/11/r8-unoffcial-document/index.html @@ -1153,7 +1153,7 @@

    - 上一篇: Android 中compileSdk、minSdk、targetSdk 是干什么用的? + 上一篇: Android 中compileSdk、minSdk、targetSdk 是干什么用的?
    diff --git a/2023/08/01/android-targetsdk-compilesdk-minsdk copy/index.html b/2024/08/01/android-targetsdk-compilesdk-minsdk copy/index.html similarity index 99% rename from 2023/08/01/android-targetsdk-compilesdk-minsdk copy/index.html rename to 2024/08/01/android-targetsdk-compilesdk-minsdk copy/index.html index 6dd75c51..36394e38 100644 --- a/2023/08/01/android-targetsdk-compilesdk-minsdk copy/index.html +++ b/2024/08/01/android-targetsdk-compilesdk-minsdk copy/index.html @@ -712,7 +712,7 @@

    目录

    @@ -767,7 +767,7 @@

    targetSdk
    - 上一篇: 函数式编程:尾调优化 + 上一篇: 你不会到现在还不知道 Android 中的那些 JDK 配置吧?
    diff --git a/2024/08/09/android-jdk-configuration/index.html b/2024/08/09/android-jdk-configuration/index.html new file mode 100644 index 00000000..182486a5 --- /dev/null +++ b/2024/08/09/android-jdk-configuration/index.html @@ -0,0 +1,980 @@ + + + + + + + + 你不会到现在还不知道 Android 中的那些 JDK 配置吧? + + + + + + + + + + +
    + + + +
    + +
    +

    你不会到现在还不知道 Android 中的那些 JDK 配置吧?

    +
    + +
    + + + +
    +
    +
    +

    在做 Android 应用开发时,不可避免的要使用到 JDK 。在众多版本的 JDK 中, 项目代码的编译会使用哪个版本,开发者要如何指定使用的 JDK 版本?选择和指定 JDK 是一个非常重要的步骤,它会影响整个开发过程。

    +

    不论你在源码是用 Java 进行编写的,还是使用 Kotlin,或者是两者都有使用。在整个项目开发迭代周期中,都会有很多地方会涉及到 JDK 版本:

    +

    JDK 关系图

    +

    Android Studio 的 JDK

    「工欲善其事,必先利其器」, Android Studio 是我们的开发利器,它的运行需要使用 JDK 环境。 在运行 Android Stduio 的时候, 会按照以下顺序去查找 JVM 运行时环境:

    +
      +
    1. STUDIO_JDK: 环境变量配置 JDK 路径,官方不建议配置

      +
    2. +
    3. studio.jdk: 与 Android Studio 打包在一起, 在 Android Studio 的目录下(PS:我没有找到)

      +
    4. +
    5. JBR: JetBrains Runtime , 与 Android Studio 打包在一起,在新版本的安装目录下有这个文件夹。 官方推荐使用这个版本,Android Studio 是在这个版本下进行测试的,并且可能还存在一些特殊的优化用于支持 Android Studio 的某些增强功能。

      +
    6. +
    7. JDK_HOME: 环境变量

      +
    8. +
    9. JAVA_HOME:环境变量

      +
    10. +
    11. PATH: 在 PATH 环境变量中指定的 java 可执行文件

      +
    12. +
    +

    只要你没有配置 STUDIO_JDK 环境变量,当前 Android Studio 默认应该都是使用 JBR 中的 Java

    +

    Android Studio 目录下的 JBR 文件夹

    +

    Gradle 使用的 JDK 版本

    Android 应用程序进行编译时,都会使用 Gradle 进行编译。 基于 Android Studio 有两种方式可以编译 Android 应用程序:

    +
      +
    1. 在 Android Studio 中直接点 ▶︎ 运行
    2. +
    +

    这两种运行方式,使用的 JDK 版本可能会存在不一致的情况。点 ▶︎ 运行时,是使用 Android Studio 中设置的值 JDK 来运行:

    +

    Android Studio 中 gradle 的设置

    +

    在默认情况下,会直接使用 jbr 的版本。当然,你也可以手动配置为 JAVA_HOME 或者是 GRADLE_LOCAL_JAVA_HOME。 这个地方的配置最终会存储到 .idea/gradle.xml 文件中去,在 Android Studio 启动时会去读取这个文件。

    +

    gradleJVM 的存储信息

    +

    关于 Gralde JDK 的配置,官方建议使用 GRADLE_LOCAL_JAVA_HOME 配置,这个宏定义会优先使用在 properties 文件中定义的 java.home 变量,如果没找到会使用 JBR。

    +
    +

    需要注意的是, 这个 JDK 除了用于 Gradle 本身运行以外,还会用于我们自定插件以及包含在 buildSrc 下面的代码编译与运行。例如我们在使用 Android Gradle Tools 的版本为 8.x 时,此时就需要将 JDK 设置成 17 及以上的版本,否则就会编译报错 :

    +

    报错信息

    +
    +
      +
    1. 在 Terminal 终端使用命令进行运行
    2. +
    +

    这种方式就行简单了,因为运行是在终端,则会直接使用环境变量中定义的 JAVA_HOME 来运行。

    +
    +

    如果在编译的时候,使用了不用的 JDK 版本或者是 Gradle 版本, 会导致创建更多的守护进程,因此也会占用更多的 CPU 和内存

    +
    +

    Java 与 Kotlin 中 JDK 的配置

    在进行 Java 源代码编译时,默认情况下,会直接使用 Gradle 所用的 JDK 版本。但在不同的环境中,可能使用的 JDK 版本存在不一致,我们可以通 Gradle 提供的 toolchain 来指定 JDK 的版本, 如果不存在,会直接下载配置中的版本:

    +
    java {
    +    toolchain {
    +        languageVersion = JavaLanguageVersion.of(17)
    +    }
    +}
    +
    +

    在不同的 Java 版本中,会存在不同的语法,比如 lambda 表达式只能在 Java 1.8 的版本及以上版本使用, 同时, Java 中还有一些功能是需要特定的库进行支持的。因此,我们可以通过 sourceCompatibility 指定使用 Java 的版本, 来保证源代码编译期间可以进行正常编译。

    +
    android {
    +    compileOptions {
    +        sourceCompatibility JavaVersion.VERSION_17
    +    }
    +}
    +
    +

    同时,在执行编译时,还可以指定输出的 class 文件使用哪个版本的文件格式。针对 Java 代码,使用 targetCompatibility 字段进行指定,而 Kotlin 使用 jvmTarget 字段进行指定。

    +
    android {
    +    compileOptions {
    +        targetCompatibility JavaVersion.VERSION_17
    +    }
    +    kotlinOptions {
    +        jvmTarget '17'
    +    }
    +}
    +
    +

    在 Android 中可以调用哪些 Java API ?

    代码除了在编译时需要关注 JDK 版本,在运行时也需要关注代码中使用的 Java API 。虽然在写代码的时候,使用的是 Java 的语法,但其运行时并不是 JVM , 因此有一些 Java 的 API 在 Android 中并无法运行。 在 Android SDK 中,定义了很多 Java 库函数实现的 API ,在绝大多数时后,开发者根本感知不到它的区别。我们可以通过 compileSdk 来指定当前 Andorid 项目支持的 Java API 的范围,具体信息如下图:

    +

    Android 支持的 Java API 的范围

    +

    Android 项目中除了配置 compileSdk , 还需要配置 minSdk 指定当前 APP 运行的最低手机版本,当代码中使用了高版本中方法(如 String.isBlank() 等 JDK 11 才提供的),就会导致低版本无法使用。此时为了兼容,R8 在编译的过程中,会对代码进行脱糖处理,将其转换成低版本就可用的代码。

    +

    写在最后

    JDK 是在代码开发过程中经常会遇到的配置,如果版本不对,搞不好就会出现一些莫名其妙的错误,了解编译运行过程中的 JDK 版本,有助于更好的解决实际开发中遇到的问题。

    + +
    +
    +
    +
    +
    +
    + +
    +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + \ No newline at end of file diff --git a/2023/08/09/java-function-patten-study/index.html b/2024/08/09/java-function-patten-study/index.html similarity index 93% rename from 2023/08/09/java-function-patten-study/index.html rename to 2024/08/09/java-function-patten-study/index.html index 77bb6d5d..6878ec38 100644 --- a/2023/08/09/java-function-patten-study/index.html +++ b/2024/08/09/java-function-patten-study/index.html @@ -698,7 +698,7 @@ @@ -712,12 +712,12 @@

    目录

    -

    在函数式编程中, 函数是一等公民,实现中,会有很多代码都使用递归进行实现。在编写优雅代码的过程中,也会引入一定的风险:栈溢出。为了解决这个问题, 为函数式编程风格的语言都会提供「尾调优化(Tail Call Optimization, TCO)」的特性。

    +

    在函数式编程中, 函数是一等公民,实现中,会有很多代码都使用递归进行实现。在编写优雅代码的过程中,也会引入一定的风险:栈溢出。为了解决这个问题, 作为函数式编程风格的语言都会提供「尾调优化(Tail Call Optimization, TCO)」的特性。

    什么是尾调用?

    尾调用(Tail Call)指的是一个函数的最后一条语句是一个返回调用函数的语句,这个函数调用可以是对另一个函数的调用,也可以是对自身的调用。举个例子:

    fun methodA(data:String): String {
       println("methodA Called")
    @@ -736,7 +736,7 @@ 

    fun sum(n: Int, result: Int): Int { if (n == 0) { return result; @@ -816,21 +816,23 @@

    sum 这个方法,此时的写法与原来的递归写法差不多,完全符合函数式的风格。在来分析一下执行的逻辑:

    +

    看不懂? 没关系,一行一行分析。 先来看一下 sum 这个方法,此时的写法与原来的递归写法差不多,完全符合函数式的风格。再来分析一下执行的逻辑:

    1. 传入的 num 为 0

    此时拿到的是 Done 的对象,调用 execute 的时候,直接返回 0

      -
    1. **传入的 num 大于 0 时,如 3 **
    2. +
    3. 传入的 num 大于 0 时,如 3
    -

    此时会直接返回一个 Suspend 对象, 并没有进行递归调用。调用 execute 方法时,才开始执行。此时在把视线移到 execute 方法里面,此时执行的是 temp.suspension() 的逻辑,即下面这个方法:

    +

    此时会直接返回一个 Suspend 对象, 并没有进行递归调用。调用 execute 方法时,才开始执行。此时再把视线移到 execute 方法里面,此时执行的是 temp.suspension() 的逻辑,即下面这个方法:

    fun(): Trampolines<Int> {
         return sum(num - 1).flatMap(fun(result: Int): Int { return result + num})
     }
     

    这个方法干的第一件事是调用了 sum(num - 1) ,依然返回一个 Suspend 对象,在这个对象中存储了一个叫 suspension 的方法,紧接着调用 flatMap 方法又会返回一个新的 Suspend 对象,在这个 Suspend 对象中,可以访问到 suspension 方法。用这种对象链式的方法,将计算从递归转换成循环了,num = 3 的执行情况如下图:

    调用链路还原图

    +

    结语

    文章中的内容介绍了递归以及解决递归栈溢出问题的模式,但这些内容仅仅是函数式编程思想中小小的一部分。

    +

    在代码 Copilot 发展如此迅速的时代,Bob 大叔依然为我们带来了他的新作:《函数式设计:原则、模式与实践》。在未来一段时间内,即使使用 GenAI 会让写代码的成本降低,但当出现错误时,其责任还是会落在开发者身上。学习函数式编程,有助于帮助我们:「保住已有的饭碗」、「寻找新的饭碗」、「保护自己的生命」。因此,不管在工作中是否有使用到函数式编程,都建议去学学。


    @@ -850,8 +852,8 @@

    - 下一篇: - Android 中compileSdk、minSdk、targetSdk 是干什么用的? + 下一篇: + 你不会到现在还不知道 Android 中的那些 JDK 配置吧?

    diff --git a/archives/2014/11/index.html b/archives/2014/11/index.html index 2f99043c..579a11a3 100644 --- a/archives/2014/11/index.html +++ b/archives/2014/11/index.html @@ -731,16 +731,16 @@
  • 2014.11.04
  • 2014.11.04
  • diff --git a/archives/2014/index.html b/archives/2014/index.html index 0ef69b17..aad57053 100644 --- a/archives/2014/index.html +++ b/archives/2014/index.html @@ -771,16 +771,16 @@
  • 2014.11.04
  • 2014.11.04
  • diff --git a/archives/2015/04/page/2/index.html b/archives/2015/04/page/2/index.html index c350f306..5eeb5e58 100644 --- a/archives/2015/04/page/2/index.html +++ b/archives/2015/04/page/2/index.html @@ -720,14 +720,6 @@

    -
  • - 2015.04.06 - -
  • -
  • 2015.04.06
    @@ -747,16 +739,16 @@
  • 2015.04.06
  • 2015.04.06
  • @@ -768,6 +760,14 @@ +
  • + 2015.04.06 + +
  • +
  • 2015.04.05
    diff --git a/archives/2015/page/3/index.html b/archives/2015/page/3/index.html index 38833433..5c8f846b 100644 --- a/archives/2015/page/3/index.html +++ b/archives/2015/page/3/index.html @@ -736,14 +736,6 @@
  • -
  • - 2015.04.06 - -
  • -
  • 2015.04.06
    @@ -763,16 +755,16 @@
  • 2015.04.06
  • 2015.04.06
  • @@ -784,6 +776,14 @@ +
  • + 2015.04.06 + +
  • +
  • 2015.04.05
    diff --git a/archives/2023/index.html b/archives/2023/index.html index 4afb0d16..f4adb611 100644 --- a/archives/2023/index.html +++ b/archives/2023/index.html @@ -712,22 +712,6 @@
    - - - -
  • -
  • - 2023.02.25 - -
  • -

diff --git a/archives/page/10/index.html b/archives/page/10/index.html index 1c26f3b1..80a1645d 100644 --- a/archives/page/10/index.html +++ b/archives/page/10/index.html @@ -712,6 +712,14 @@
+
  • + 2014.11.04 + +
  • +
  • 2014.11.03
    @@ -784,14 +792,6 @@
  • -
  • - 2014.10.11 - -
  • - diff --git a/categories/Java/index.html b/categories/Java/index.html index bb860ce0..6062d74f 100644 --- a/categories/Java/index.html +++ b/categories/Java/index.html @@ -713,10 +713,18 @@
    • - 2023.08.09 + 2024.08.09 +
    • + +
    • + 2024.08.09 +
    • diff --git "a/categories/\345\256\211\345\215\223/index.html" "b/categories/\345\256\211\345\215\223/index.html" index 1703e071..badfa9a6 100644 --- "a/categories/\345\256\211\345\215\223/index.html" +++ "b/categories/\345\256\211\345\215\223/index.html" @@ -713,10 +713,10 @@
      • - 2023.08.01 + 2024.08.01
      • diff --git a/index.html b/index.html index 4db410fa..4f0974d4 100644 --- a/index.html +++ b/index.html @@ -714,23 +714,40 @@
        - 函数式编程:尾调优化 + 函数式编程:尾调优化
        - 在函数式编程中, 函数是一等公民,实现中,会有很多代码都使用递归进行实现。在编写优雅代码的过程中,也会引入一定的风险:栈溢出。为了解决这个问题, 为函数式编程风格的语言都会提供「尾调优化(Tail Call Optimization, TCO)」的特性。 + 在函数式编程中, 函数是一等公民,实现中,会有很多代码都使用递归进行实现。在编写优雅代码的过程中,也会引入一定的风险:栈溢出。为了解决这个问题, 作为函数式编程风格的语言都会提供「尾调优化(Tail Call Optimization, TCO)」的特性。 什么是尾调用?尾调用(Tail Call)指的是一个函数的最后一条语句是一个返回调用函数的语句,这个函数调用可以是对另一个函数的调用,也可以是对自身的调用。举个例子: -fun methodA(data:String): St +fun methodA(data:String): S - ... + ...
        - +
        - Android 中compileSdk、minSdk、targetSdk 是干什么用的? + 你不会到现在还不知道 Android 中的那些 JDK 配置吧? +
        + + 在做 Android 应用开发时,不可避免的要使用到 JDK 。在众多版本的 JDK 中, 项目代码的编译会使用哪个版本,开发者要如何指定使用的 JDK 版本?选择和指定 JDK 是一个非常重要的步骤,它会影响整个开发过程。 +不论你在源码是用 Java 进行编写的,还是使用 Kotlin,或者是两者都有使用。在整个项目开发迭代周期中,都会有很多地方会涉及到 JDK 版本: + +Android Studio 的 JDK「工欲善其事,必先利其器」, Android Studi + + ... +
        + +
        + + + + +
        + Android 中compileSdk、minSdk、targetSdk 是干什么用的?
        作为多年 Android 开发的老司机, compileSdk 、minSdk、targetSdk 都是经常见到,但其具体含义是什么? 它们都是在什么场景下去使用的。 回想起来还真不太能说得清楚。 @@ -738,9 +755,9 @@ 在如此多的版本迭代更新的过程中,Android 操作系统中不断引入新的接口,也不断的对 App 添加一些新的限制 - ... + ...
        - +
        @@ -850,22 +867,6 @@ - - -
        - Git 必知必会:原理剖析(二) -
        - - 书接上文,在上一篇文章记录Git 必知必会:原理解析 中记录了 Git 原理中的一部分信息,但在后续的学习过程中,还有部分内容需要记录,但有了此篇内容。 -一、Git 中的引用从上面的 Git 仓库树目录存储结构图中,可以看到,通过 commit 的 SHA-1 值,我们就一步一步查看所有的提交记录,以及项目中的文件内容。但 40 位的字符串几乎不可能记忆下来,也没有什么实质性的意义。那如果我们能给这些值取上一个别名,那是不是就能够很容易找到以及使用了。 -在 Git 中,此功能 - - ... -
        - -
        - -
        diff --git a/page/10/index.html b/page/10/index.html index d3cdeb40..b151091d 100644 --- a/page/10/index.html +++ b/page/10/index.html @@ -713,6 +713,23 @@ +
        + Android之Notification的使用(一) +
        + + Android之Notification的使用(一)在通知栏展示一些及时消息是一件非常常见的事情,相对来说,使用Notification也是一件很简单的事情。 +一个简单的事情,做起来也会遇到bug,先贴代码: +Intent intent = new Intent(this, OtherActivity.class); +String currentTime = DateTimeUtil.formatDateDefault(Calendar.getInstance().getT + + ... +
        + +
        + + + +
        Ubuntu 下安装Navicat
        diff --git a/page/2/index.html b/page/2/index.html index ebc0f2f1..f2e3ad82 100644 --- a/page/2/index.html +++ b/page/2/index.html @@ -713,6 +713,22 @@ +
        + Git 必知必会:原理剖析(二) +
        + + 书接上文,在上一篇文章记录Git 必知必会:原理解析 中记录了 Git 原理中的一部分信息,但在后续的学习过程中,还有部分内容需要记录,但有了此篇内容。 +一、Git 中的引用从上面的 Git 仓库树目录存储结构图中,可以看到,通过 commit 的 SHA-1 值,我们就一步一步查看所有的提交记录,以及项目中的文件内容。但 40 位的字符串几乎不可能记忆下来,也没有什么实质性的意义。那如果我们能给这些值取上一个别名,那是不是就能够很容易找到以及使用了。 +在 Git 中,此功能 + + ... +
        + +
        + + + +
        Git 必知必会:原理剖析(一)
        @@ -850,20 +866,6 @@
        - - -
        - Android Network security configuration -
        - - The Network Security Configuration feature lets apps customize their network security settings in a safe, declarative configuration file without modifying app code. These settings can be configured for specific domains and for a specific ap - - ... -
        - -
        - -
        diff --git a/page/3/index.html b/page/3/index.html index a19eb4d8..74bfbb62 100644 --- a/page/3/index.html +++ b/page/3/index.html @@ -713,6 +713,20 @@ +
        + Android Network security configuration +
        + + The Network Security Configuration feature lets apps customize their network security settings in a safe, declarative configuration file without modifying app code. These settings can be configured for specific domains and for a specific ap + + ... +
        + +
        + + + +
        Android Camera Preview
        @@ -849,20 +863,6 @@
        - - -
        - Android RelativeLayout 之 Gravity 的使用 -
        - - 在xml中,ViewGroup用来控制view布局位置,我们可以使用android:gravity="center"来实现。但是很少会在RelativeLayout中使用,今天碰到了一个项目中的布局使用了这个属性。但是在印象中这个属性在RelativeLayout是不生效的。但是,在项目中,这个属性生效了,并且引起了一个问题。去百度了一下,好多人在博客里面写的这个属性在RelativeLayout不生效,在这里,我在强调一下,RelativeLayout中 - - ... -
        - -
        - -
        diff --git a/page/4/index.html b/page/4/index.html index fa9179bc..23d35061 100644 --- a/page/4/index.html +++ b/page/4/index.html @@ -713,6 +713,20 @@ +
        + Android RelativeLayout 之 Gravity 的使用 +
        + + 在xml中,ViewGroup用来控制view布局位置,我们可以使用android:gravity="center"来实现。但是很少会在RelativeLayout中使用,今天碰到了一个项目中的布局使用了这个属性。但是在印象中这个属性在RelativeLayout是不生效的。但是,在项目中,这个属性生效了,并且引起了一个问题。去百度了一下,好多人在博客里面写的这个属性在RelativeLayout不生效,在这里,我在强调一下,RelativeLayout中 + + ... +
        + +
        + + + +
        Android Studio Gradle Download Error
        @@ -867,28 +881,6 @@
        - - -
        - SVN迁移到GIT -
        - - 通过git svn clone将一个SVN项目克隆成一个git版本库 -# 参数--no-metadata表示阻止git导出SVN包含的一些无用信息 -git svn clone svn://localhost/proj/ --no-metadata - -提交到git库 -git remote add origin git@localhost/proj.git -git push --set-upstream origin master - - - - ... -
        - -
        - -
        diff --git a/page/5/index.html b/page/5/index.html index 915cbb8e..9fd97218 100644 --- a/page/5/index.html +++ b/page/5/index.html @@ -713,6 +713,28 @@ +
        + SVN迁移到GIT +
        + + 通过git svn clone将一个SVN项目克隆成一个git版本库 +# 参数--no-metadata表示阻止git导出SVN包含的一些无用信息 +git svn clone svn://localhost/proj/ --no-metadata + +提交到git库 +git remote add origin git@localhost/proj.git +git push --set-upstream origin master + + + + ... +
        + +
        + + + +
        Android Service学习之AIDL, Parcelable和远程服务
        @@ -819,9 +841,6 @@
        - - -
        diff --git a/page/6/index.html b/page/6/index.html index 523e8635..e36a44d9 100644 --- a/page/6/index.html +++ b/page/6/index.html @@ -733,6 +733,9 @@ + + + @@ -757,25 +760,6 @@
        - - -
        - Android Studio 中加载so库文件 -
        - - 在使用第三方库的时候,经常会遇到一些第三方的so库文件。 -以前在Eclipse中,只需要将*.so 的文件放到libs文件目录下就行了。 -可是在使用Android Studio的时候,却出了点小问题。记录一下,以备后面查阅: -首先,还是将*.so文件导入到libs文件目录下面。Android Studio使用的是gradle进行编译的。在bulid.gradle文件里面,你可以很清晰的看到如下代码: -dependencies { - compile fileTr - - ... -
        - -
        - -
        diff --git a/page/7/index.html b/page/7/index.html index 22ff07f3..c89e3fc5 100644 --- a/page/7/index.html +++ b/page/7/index.html @@ -713,6 +713,25 @@ +
        + Android Studio 中加载so库文件 +
        + + 在使用第三方库的时候,经常会遇到一些第三方的so库文件。 +以前在Eclipse中,只需要将*.so 的文件放到libs文件目录下就行了。 +可是在使用Android Studio的时候,却出了点小问题。记录一下,以备后面查阅: +首先,还是将*.so文件导入到libs文件目录下面。Android Studio使用的是gradle进行编译的。在bulid.gradle文件里面,你可以很清晰的看到如下代码: +dependencies { + compile fileTr + + ... +
        + +
        + + + +
        Ubuntu 下安装Rails
        @@ -874,23 +893,6 @@
        - - -
        - Advanced Android TextView -
        - - TextView是一个经常使用的组件,但是你并不一定完全知道他的详细使用方法及具体细节。 -在github上面看到一个PPT,详细的写到了TextView的用法。 -参考地址: Advanced Android TextView - - - ... -
        - -
        - -
        diff --git a/page/8/index.html b/page/8/index.html index 2d1a6320..e0656274 100644 --- a/page/8/index.html +++ b/page/8/index.html @@ -713,6 +713,23 @@ +
        + Advanced Android TextView +
        + + TextView是一个经常使用的组件,但是你并不一定完全知道他的详细使用方法及具体细节。 +在github上面看到一个PPT,详细的写到了TextView的用法。 +参考地址: Advanced Android TextView + + + ... +
        + +
        + + + +
        TextView高亮URL地址解析
        @@ -905,26 +922,6 @@
        - - -
        - Andorid UI注入工具的使用(ButterKnife) -
        - - 一个Android项目中,必不可少有很多UI,并且Activity要控制这些UI,当然,我们会用到以下代码: -// 获取View的引用 -Button mBtn = (Button) this.findViewById(R.id.btn); -// 给Button添加事件 -mBtn.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view)  - - ... -
        - -
        - -
        diff --git a/page/9/index.html b/page/9/index.html index 27761a8b..b8995d8f 100644 --- a/page/9/index.html +++ b/page/9/index.html @@ -733,6 +733,26 @@ +
        + Andorid UI注入工具的使用(ButterKnife) +
        + + 一个Android项目中,必不可少有很多UI,并且Activity要控制这些UI,当然,我们会用到以下代码: +// 获取View的引用 +Button mBtn = (Button) this.findViewById(R.id.btn); +// 给Button添加事件 +mBtn.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view)  + + ... +
        + +
        + + + +
        Android 项目中出现的奇葩bug, 数据NullPointExcption
        @@ -889,23 +909,6 @@
        - - -
        - Android之Notification的使用(一) -
        - - Android之Notification的使用(一)在通知栏展示一些及时消息是一件非常常见的事情,相对来说,使用Notification也是一件很简单的事情。 -一个简单的事情,做起来也会遇到bug,先贴代码: -Intent intent = new Intent(this, OtherActivity.class); -String currentTime = DateTimeUtil.formatDateDefault(Calendar.getInstance().getT - - ... -
        - -
        - -
        diff --git a/snippet/index.html b/snippet/index.html index 9f866f47..4285e23b 100644 --- a/snippet/index.html +++ b/snippet/index.html @@ -741,9 +741,6 @@

        SD Card的大小和容量< long sdTotalSize = (long)stat.getBlockCount() * (long)stat.getBlockSize() -

        Android string.xml中的占位符

        <!-- .2f表示的是保留三位小数的浮点数  -->
        -<string name="book">书名 (字符串)%1$s,作者(字符串)%2$s,编号(整数)%3$d,价格(浮点型):%4$.2f</string>
        -

        在`values`中定义id

        values文件夹中创建ids.xml文件, 文件目录为:values/ids.xml

        我们有时候,会在代码中定义一个组件,如TextView,但是我们想给他设置一个Id,又不知道该设置一个
        什么值比较好,就可以用上术方法来定义一个id, 具体代码如下:

        <?xml version="1.0" encoding="utf-8"?>
        @@ -763,16 +760,6 @@ 

        格式化文件容量代 } }

        -

        gradle打包的时候,自动重命名APK文件

        android.applicationVariants.all { variant ->
        -    variant.outputs.each { output ->
        -        def outputFile = output.outputFile
        -        if (outputFile != null && outputFile.name.endsWith('.apk')) {
        -            def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}-${ defaultConfig.versionCode}.apk")
        -            output.outputFile = new File(outputFile.parent, fileName)
        -        }
        -    }
        -}
        -

        Android 按两次返回键退出应用程序

        public boolean onKeyDown(int keyCode, KeyEvent event) {
             if (keyCode == KeyEvent.KEYCODE_BACK) {
                 if ((System.currentTimeMillis() - mExitTime) > 2000) {
        @@ -788,6 +775,9 @@ 

        Android 按两次返回键 return super.onKeyDown(keyCode, event); }

        +

        Android string.xml中的占位符

        <!-- .2f表示的是保留三位小数的浮点数  -->
        +<string name="book">书名 (字符串)%1$s,作者(字符串)%2$s,编号(整数)%3$d,价格(浮点型):%4$.2f</string>
        +

        Android文字颜色选择器

        //在这个地方,应该使用
         //android:textColor="@drawable/text_color"
         
        @@ -798,6 +788,56 @@ 

        Android文字颜色选择 <item android:color="@color/blue_color"></item> </selector>

        +

        gradle打包的时候,自动重命名APK文件

        android.applicationVariants.all { variant ->
        +    variant.outputs.each { output ->
        +        def outputFile = output.outputFile
        +        if (outputFile != null && outputFile.name.endsWith('.apk')) {
        +            def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}-${ defaultConfig.versionCode}.apk")
        +            output.outputFile = new File(outputFile.parent, fileName)
        +        }
        +    }
        +}
        +
        +

        Android 混淆记录

        --keep class cn.knero.model.*{
        +    public <methods>; // 不混淆public的方法
        +}
        +
        +
        +# Google Gson
        +#---------------Begin: proguard configuration for Gson  ----------
        +# Gson uses generic type information stored in a class file when working with fields. Proguard
        +# removes such information by default, so configure it to keep all of it.
        +-keepattributes Signature
        +# Gson specific classes
        +-keep class sun.misc.Unsafe { *; }
        +#-keep class com.google.gson.stream.** { *; }
        +# Application classes that will be serialized/deserialized over Gson
        +-keep class com.google.gson.examples.android.model.** { *; }
        +-keep class com.google.** { *; }
        +-keep class * extends com.google.gson.reflect.TypeToken
        +-keep class com.google.gson.reflect.TypeToken
        +##---------------End: proguard configuration for Gson  ----------
        +
        +
        +#混淆某个方法
        +-keepclassmembers class cn.knero.fragment.BaseContentFragment {
        +    public android.view.View refreshError();
        +    public android.view.View onLoading();
        +}
        +
        +

        java反射内部类

          +
        1. 在java中反射加载类的方法如下
        2. +
        +
        Class rClass = Class.forName("android.R");
        +
        +
          +
        1. 加载android.R.attr
        2. +
        +
        Class attrClass = Class.forName("android.R$attr");
        +
        +
        +

        内部类并不是像调用那样,使用., 而是使用$

        +

        Android TextView 设置字体大小

        /**
          * Set the default text size to the given value, interpreted as "scaled
          * pixel" units.  This size is adjusted based on the current density and
        @@ -848,19 +888,6 @@ 

        Android TextView 设置字

        以上代码是Android TextView设置字体的源码。可以看出来,使用setTextSize(float size)的时候,默认单位为sp

        如果你自己从xml中读的时候,最好使用setTextSize(int unit, float size)这个方法。

        -

        java反射内部类

          -
        1. 在java中反射加载类的方法如下
        2. -
        -
        Class rClass = Class.forName("android.R");
        -
        -
          -
        1. 加载android.R.attr
        2. -
        -
        Class attrClass = Class.forName("android.R$attr");
        -
        -
        -

        内部类并不是像调用那样,使用., 而是使用$

        -

        Android显示密码

        
         //  方法1:
         if (mIsShowPsw) {
        @@ -879,33 +906,6 @@ 

        Android显示密码 mPswEdit.setInputType(129); }

        -

        Android 混淆记录

        --keep class cn.knero.model.*{
        -    public <methods>; // 不混淆public的方法
        -}
        -
        -
        -# Google Gson
        -#---------------Begin: proguard configuration for Gson  ----------
        -# Gson uses generic type information stored in a class file when working with fields. Proguard
        -# removes such information by default, so configure it to keep all of it.
        --keepattributes Signature
        -# Gson specific classes
        --keep class sun.misc.Unsafe { *; }
        -#-keep class com.google.gson.stream.** { *; }
        -# Application classes that will be serialized/deserialized over Gson
        --keep class com.google.gson.examples.android.model.** { *; }
        --keep class com.google.** { *; }
        --keep class * extends com.google.gson.reflect.TypeToken
        --keep class com.google.gson.reflect.TypeToken
        -##---------------End: proguard configuration for Gson  ----------
        -
        -
        -#混淆某个方法
        --keepclassmembers class cn.knero.fragment.BaseContentFragment {
        -    public android.view.View refreshError();
        -    public android.view.View onLoading();
        -}
        -

        Android 截取EditText输入的Emoji表情

        public String subInputText(String inputText,int index) {
             int unicode = Character.codePointAt(text, index);
             int skip = Character.charCount(unicode);
        diff --git a/tags/Android-Proguard/index.html b/tags/Android-Proguard/index.html
        index 87476d80..29f79e88 100644
        --- a/tags/Android-Proguard/index.html
        +++ b/tags/Android-Proguard/index.html
        @@ -713,10 +713,10 @@
             

        -
        - \ No newline at end of file diff --git a/tags/Android/index.html b/tags/Android/index.html index 0baf45ec..30567946 100644 --- a/tags/Android/index.html +++ b/tags/Android/index.html @@ -713,10 +713,10 @@