在Kotlin,我们可以做到:
val arr = intArrayOf(1,2,3)
if (2 in arr)
println("in list")
Run Code Online (Sandbox Code Playgroud)
但是,如果我想检查2 或 3是否在arr
,除了以下之外,最常用的方法是:
if (2 in arr || 3 in arr)
println("in list")
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的Android项目中设置数据绑定,如下所示:
dataBinding {
enabled = true
}
Run Code Online (Sandbox Code Playgroud)
但是,当我添加支持库依赖项时,lint会抱怨:
所有com.android.support库必须使用完全相同的版本规范(混合版本可能导致运行时崩溃).发现版本25.1.0,21.0.3.示例包括'com.android.support:animated-vector-drawable:25.1.0'和'com.android.support:support-v4:21.0.3'
当我跑步时./gradlew app:dependencies
,我得到以下内容:
...
+--- com.android.support:appcompat-v7:25.1.0
| +--- com.android.support:support-annotations:25.1.0
| +--- com.android.support:support-v4:25.1.0
| | +--- com.android.support:support-compat:25.1.0 (*)
| | +--- com.android.support:support-media-compat:25.1.0
| | | +--- com.android.support:support-annotations:25.1.0
| | | \--- com.android.support:support-compat:25.1.0 (*)
| | +--- com.android.support:support-core-utils:25.1.0
| | | +--- com.android.support:support-annotations:25.1.0
| | | \--- com.android.support:support-compat:25.1.0 (*)
| | +--- com.android.support:support-core-ui:25.1.0 (*)
| | \--- com.android.support:support-fragment:25.1.0
| | +--- com.android.support:support-compat:25.1.0 (*)
| | +--- com.android.support:support-media-compat:25.1.0 (*)
| | +--- com.android.support:support-core-ui:25.1.0 …
Run Code Online (Sandbox Code Playgroud) 我有一个包含多个模块的Android项目,即使我尝试重建它而不改变任何东西,构建时间也很慢.
其结构类似于:
有更多的"父"(和独立的父兄弟姐妹)和"功能"模块,但设置是图片的设置.
我的gradle.properties
文件如下:
org.gradle.jvmargs=-Xmx4096m -Xms2048m
org.gradle.parallel=true
org.gradle.daemon=true
org.gradle.configureondemand=true
Run Code Online (Sandbox Code Playgroud)
我使用的是Gradle版本3.5和插件版本2.4.0-alpha7.
该项目还使用multidex(javaMaxHeapSize "4g"
和jumboMode true
),数据绑定,kotlin和java以及几个注释处理器.
在构建时,我可以看到多个线程并行运行不同的任务,对于大多数项目来说,除了主要用于最终的"app"模块(我认为是正常的).
但是很多时候似乎花在了不同的:: compileJavaWithJavac任务上.即使没有改变任何东西,在配备16 Gb RAM的MacBook Pro i7上构建也需要大约30秒.
如果我在功能模块的方法中更改了一行代码(甚至没有更改方法的签名),则构建时间超过1:30分钟.
这些正常时期?有什么我可以进一步优化以改善构建时间吗?
我还检查了一些其他答案:
我的Android应用程序使用Java 8 lambdas,如下所示:
myView.setOnClickListener(view -> someMethod());
Run Code Online (Sandbox Code Playgroud)
在构建应用程序或运行单元测试时,一切正常.但是,当我运行时./gradlew connectedAndroidTest
,我收到以下错误:
Execution failed for task ':myModule:transformClassesWithDesugarForDebugAndroidTest'.
Exception in thread "main" java.lang.IllegalStateException: Couldn't desugar invokedynamic for com/.../MyActivity.onClick using java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (6) with arguments [(Landroid/view/View;)V, com/.../MyActivity.lambda$onViewBound$0(Landroid/view/View;)V (7), (Landroid/view/View;)V]
at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:474)
at org.objectweb.asm.ClassReader.readCode(ClassReader.java:1623)
at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1126)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:698)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:500)
at com.google.devtools.build.android.desugar.Desugar.desugarClassesInInput(Desugar.java:477)
at com.google.devtools.build.android.desugar.Desugar.desugarOneInput(Desugar.java:361)
at com.google.devtools.build.android.desugar.Desugar.desugar(Desugar.java:314)
at com.google.devtools.build.android.desugar.Desugar.main(Desugar.java:711)
Caused by: java.lang.IllegalAccessException: no such method: com...MyActivity.lambda$onViewBound$0(View)void/invokeSpecial
at java.lang.invoke.MemberName.makeAccessException(MemberName.java:867)
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1003)
at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1386)
at java.lang.invoke.MethodHandles$Lookup.findSpecial(MethodHandles.java:1004)
at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.toMethodHandle(LambdaDesugaring.java:670)
at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.toJvmMetatype(LambdaDesugaring.java:647)
at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:408)
... 8 more
Caused by: java.lang.NoClassDefFoundError: com/.../databinding/MyActivityBinding …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个intellij插件,我正在重构一个类,将其getters(例如fun name(): String
)更改为字段(例如val name: String
).
但是,我不知道如何最好地更新相应的PsiReference
实例.Kotlin调用者需要更改myObj.name()
为myObj.name
不带括号.
目前,我正在做以下事情:
ReferencesSearch.search(function).findAll().forEach {
val nextSibling = it.element.nextSibling
if ((nextSibling as? KtValueArgumentList)?.arguments?.isEmpty() == true) {
nextSibling.delete()
}
}
Run Code Online (Sandbox Code Playgroud)
以上工作有点.也就是说,转换正确发生.但是,IDE仍然认为它正在调用一个函数.它myObj.name
使用以下消息强调转换中的错误:
类型的表达式"名称"
String
不能作为函数调用.找不到函数'invoke()'
name
在编辑器中手动重写强制intellij刷新引用并且错误消失.
我应该怎么做以防止这种情况发生?
我在某些设备API 6.0+上遇到以下崩溃:
Fatal Exception: java.lang.SecurityException: Client must have ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to perform any location operations.
at android.os.Parcel.readException(Parcel.java:1693)
at android.os.Parcel.readException(Parcel.java:1646)
at com.google.android.gms.internal.zzed.zza(Unknown Source)
at com.google.android.gms.internal.zzcda.zzdw(Unknown Source)
at com.google.android.gms.internal.zzcdd.zzvQ(Unknown Source)
at com.google.android.gms.internal.zzcdj.zzvQ(Unknown Source)
at com.google.android.gms.location.zzf.zza(Unknown Source)
at com.google.android.gms.internal.zzbaq.zza(Unknown Source)
at com.google.android.gms.internal.zzbdd.zzb(Unknown Source)
at com.google.android.gms.internal.zzbdd.zzqq(Unknown Source)
at com.google.android.gms.internal.zzbdd.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zzaa.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zzn.zzj(Unknown Source)
at com.google.android.gms.common.internal.zze.zzrj(Unknown Source)
at com.google.android.gms.common.internal.zzi.zzrk(Unknown Source)
at com.google.android.gms.common.internal.zzh.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.os.HandlerThread.run(HandlerThread.java:61)
Run Code Online (Sandbox Code Playgroud)
请注意,在进行任何与位置相关的操作之前,我要求用户获得位置许可.但由于某种原因我无法重现,有些设备似乎在我使用时报告了位置权限:
boolean hasPermission = ActivityCompat.checkSelfPermission(context, permission) == …
Run Code Online (Sandbox Code Playgroud) 我将以下内容放在项目gradle文件的末尾:
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs +=
['-Xep:MissingOverride:ERROR',
'-Xep:MissingCasesInEnumSwitch:ERROR',]
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在我的代码中,如果我在@Override
某处删除了注释或删除了switch语句,我的Android项目仍会生成。它不应该因错误而失败吗?