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 @@这一次的空指针的最根本原因是在父类的构造方法中执行了子类实例变量的初始化
操作,这是一个非常不合理的举动。如果子类属性中的东西应该在子类中进行初始化,
而不是在父类中调用初始化方法。
代码木有上传上来,如果你想看看这个丑陋的代码是怎么写的,你可以邮件联系我:
lovecluo@nightweaver.org
代码木有上传上来,如果你想看看这个丑陋的代码是怎么写的,你可以邮件联系我:
lovecluo@nightweaver.org
更新代码地址:
就是HttpHeaderParser.parseCacheHeaders(response)
实现Response
向Cache.Entry
的转换。
当然,你可以实现自己的parseCacheHeaders
的方法,来实现你自己的缓存侧略。
到此为止,基本写完了我所读到的Volley
中实现Cache
的方法。如果你对本文或者我有什么意见或者建议。
请骚扰我:lovecluo@nightweaver.org
到此为止,基本写完了我所读到的Volley
中实现Cache
的方法。如果你对本文或者我有什么意见或者建议。
请骚扰我:lovecluo@nightweaver.org
你不会到现在还不知道 Android 中的那些 JDK 配置吧?
+在做 Android 应用开发时,不可避免的要使用到 JDK 。在众多版本的 JDK 中, 项目代码的编译会使用哪个版本,开发者要如何指定使用的 JDK 版本?选择和指定 JDK 是一个非常重要的步骤,它会影响整个开发过程。
+不论你在源码是用 Java 进行编写的,还是使用 Kotlin,或者是两者都有使用。在整个项目开发迭代周期中,都会有很多地方会涉及到 JDK 版本:
+ +「工欲善其事,必先利其器」, Android Studio 是我们的开发利器,它的运行需要使用 JDK 环境。 在运行 Android Stduio 的时候, 会按照以下顺序去查找 JVM 运行时环境:
+STUDIO_JDK: 环境变量配置 JDK 路径,官方不建议配置
+studio.jdk: 与 Android Studio 打包在一起, 在 Android Studio 的目录下(PS:我没有找到)
+JBR: JetBrains Runtime , 与 Android Studio 打包在一起,在新版本的安装目录下有这个文件夹。 官方推荐使用这个版本,Android Studio 是在这个版本下进行测试的,并且可能还存在一些特殊的优化用于支持 Android Studio 的某些增强功能。
+JDK_HOME: 环境变量
+JAVA_HOME:环境变量
+PATH: 在 PATH 环境变量中指定的 java 可执行文件
+只要你没有配置 STUDIO_JDK 环境变量,当前 Android Studio 默认应该都是使用 JBR 中的 Java
+ +Android 应用程序进行编译时,都会使用 Gradle 进行编译。 基于 Android Studio 有两种方式可以编译 Android 应用程序:
+这两种运行方式,使用的 JDK 版本可能会存在不一致的情况。点 ▶︎ 运行时,是使用 Android Studio 中设置的值 JDK 来运行:
+ +在默认情况下,会直接使用 jbr 的版本。当然,你也可以手动配置为 JAVA_HOME
或者是 GRADLE_LOCAL_JAVA_HOME
。 这个地方的配置最终会存储到 .idea/gradle.xml
文件中去,在 Android Studio 启动时会去读取这个文件。
关于 Gralde JDK 的配置,官方建议使用 GRADLE_LOCAL_JAVA_HOME
配置,这个宏定义会优先使用在 properties
文件中定义的 java.home
变量,如果没找到会使用 JBR。
++需要注意的是, 这个 JDK 除了用于 Gradle 本身运行以外,还会用于我们自定插件以及包含在
+ +buildSrc
下面的代码编译与运行。例如我们在使用 Android Gradle Tools 的版本为 8.x 时,此时就需要将 JDK 设置成 17 及以上的版本,否则就会编译报错 :
这种方式就行简单了,因为运行是在终端,则会直接使用环境变量中定义的 JAVA_HOME 来运行。
+++如果在编译的时候,使用了不用的 JDK 版本或者是 Gradle 版本, 会导致创建更多的守护进程,因此也会占用更多的 CPU 和内存
+
在进行 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'
+ }
+}
+
+代码除了在编译时需要关注 JDK 版本,在运行时也需要关注代码中使用的 Java API 。虽然在写代码的时候,使用的是 Java 的语法,但其运行时并不是 JVM , 因此有一些 Java 的 API 在 Android 中并无法运行。 在 Android SDK 中,定义了很多 Java 库函数实现的 API ,在绝大多数时后,开发者根本感知不到它的区别。我们可以通过 compileSdk
来指定当前 Andorid 项目支持的 Java API 的范围,具体信息如下图:
Android 项目中除了配置 compileSdk
, 还需要配置 minSdk
指定当前 APP 运行的最低手机版本,当代码中使用了高版本中方法(如 String.isBlank()
等 JDK 11 才提供的),就会导致低版本无法使用。此时为了兼容,R8 在编译的过程中,会对代码进行脱糖处理,将其转换成低版本就可用的代码。
JDK 是在代码开发过程中经常会遇到的配置,如果版本不对,搞不好就会出现一些莫名其妙的错误,了解编译运行过程中的 JDK 版本,有助于更好的解决实际开发中遇到的问题。
+ +在函数式编程中, 函数是一等公民,实现中,会有很多代码都使用递归进行实现。在编写优雅代码的过程中,也会引入一定的风险:栈溢出。为了解决这个问题, 为函数式编程风格的语言都会提供「尾调优化(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
这个方法,此时的写法与原来的递归写法差不多,完全符合函数式的风格。再来分析一下执行的逻辑:
- 传入的 num 为 0
此时拿到的是
Done
的对象,调用execute
的时候,直接返回 0-
-- **传入的 num 大于 0 时,如 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 会让写代码的成本降低,但当出现错误时,其责任还是会落在开发者身上。学习函数式编程,有助于帮助我们:「保住已有的饭碗」、「寻找新的饭碗」、「保护自己的生命」。因此,不管在工作中是否有使用到函数式编程,都建议去学学。
<!-- .2f表示的是保留三位小数的浮点数 -->
-<string name="book">书名 (字符串)%1$s,作者(字符串)%2$s,编号(整数)%3$d,价格(浮点型):%4$.2f</string>
-
在values
文件夹中创建ids.xml
文件, 文件目录为:values/ids.xml
我们有时候,会在代码中定义一个组件,如TextView
,但是我们想给他设置一个Id,又不知道该设置一个
什么值比较好,就可以用上术方法来定义一个id
, 具体代码如下:
<?xml version="1.0" encoding="utf-8"?>
@@ -763,16 +760,6 @@ 格式化文件容量代
}
}
-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)
- }
- }
-}
-
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);
}
+<!-- .2f表示的是保留三位小数的浮点数 -->
+<string name="book">书名 (字符串)%1$s,作者(字符串)%2$s,编号(整数)%3$d,价格(浮点型):%4$.2f</string>
+
//在这个地方,应该使用
//android:textColor="@drawable/text_color"
@@ -798,6 +788,56 @@ Android文字颜色选择
<item android:color="@color/blue_color"></item>
</selector>
+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)
+ }
+ }
+}
+
+--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();
+}
+
+Class rClass = Class.forName("android.R");
+
+Class attrClass = Class.forName("android.R$attr");
+
++内部类并不是像调用那样,使用
+.
, 而是使用$
/**
* 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)
这个方法。
Class rClass = Class.forName("android.R");
-
-Class attrClass = Class.forName("android.R$attr");
-
--内部类并不是像调用那样,使用
-.
, 而是使用$
// 方法1:
if (mIsShowPsw) {
@@ -879,33 +906,6 @@ Android显示密码
mPswEdit.setInputType(129);
}
---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();
-}
-
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 @@
-
- 2022.09.23
+ 2022.10.01
@@ -885,6 +885,4 @@