我有一个Kotlin助手类定义为:
class CountdownTimer(endDateInSeconds: Long, callback: (timeRemaining: RemainingTime) -> Unit)
Run Code Online (Sandbox Code Playgroud)
顾名思义,它需要一个纪元时间和一个回调,以固定的时间间隔(在这种情况下为秒)调用,直到达到结束日期.RemainingTime是一个数据类,包含到结束日期之前的时间量(秒,分钟,小时等).
我可以干净利用Kotlin的这个课程:
countdownTimer = CountdownTimer(endDate, { timeRemaining ->
var timeString = // format time remaining into a string
view?.updateCountdownTimer(timeString)
})
Run Code Online (Sandbox Code Playgroud)
但是当我从Java调用它时,我被迫在回调中提供一个不必要的返回值,即使匿名函数指定了一个Unit返回类型(理论上它相当于Java void返回类型):
this.countdownTimer = new CountdownTimer(this.endDate, remainingTime -> {
var timeString = // format time remaining into a string
if (view != null) {
view.updateCountdownTimer(timeString);
}
return null;
});
Run Code Online (Sandbox Code Playgroud)
虽然从技术上讲不是问题,但是必须从Java回调中提供无意义的返回值似乎是错误的.有没有更好的方式在Kotlin中表达这种回调?
我正在尝试在Kotlin中实现一个Android计时器,它将以定义的时间间隔触发事件.我不想使用TimerTask,因为它有记录的弱点(见这里),虽然还有其他方法可以做到这一点,但我想在后延迟循环中使用Handler/Runnable.在Java中,这是可能的,因为Runnable可以在初始化器中引用它自己,但是在Kotlin中似乎这是不可能的:
private fun startBoutiqueRefreshTimer(delayMs: Long) {
val handler = Handler()
val runnable = Runnable() {
EventManager.post(BoutiqueRefreshTimerEvent())
handler.postDelayed(runnable, delayMs)
}
handler.postDelayed(runnable, delayMs)
}
Run Code Online (Sandbox Code Playgroud)
因为runnable无法在内部postDelayed调用中解析.Kotlin显然阻止了自己的初始化程序中的变量引用.
什么是这个问题的好方法,仍然使用Handler/Runnable方法?
我们最近将应用程序的minSdkVersion从16(Jellybean)提升到了21(Lollipop).虽然我们主要使用调试版本对我们的应用程序进行了大量测试,但我们现在面临着应用启动时的大量生产崩溃,主要是在较旧的三星设备上 - (Note3和S4是顶级的crashers)并且总是在Lollipop上.
错误是
Fatal Exception: java.lang.NoClassDefFoundError: com.retailconvergence.ruelala.delegate.GoogleLoginDelegate
at com.retailconvergence.ruelala.delegate.LifecycleDelegateManager.addDelegateOfType(LifecycleDelegateManager.java:48)
at com.retailconvergence.ruelala.extensions.activity.LifecycleDelegateActivity.addDelegateOfType(LifecycleDelegateActivity.java:55)
at com.retailconvergence.ruelala.activity.SplashActivity.setupDelegates(SplashActivity.java:198)
at com.retailconvergence.ruelala.activity.SplashActivity.onCreate(SplashActivity.java:60)
at android.app.Activity.performCreate(Activity.java:6288)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)
at android.app.ActivityThread.access$900(ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Run Code Online (Sandbox Code Playgroud)
SplashActivity是应用程序的初始启动活动.未找到的课程是一个历史悠久的课程,而不是新引入的课程.作为旁注,作为最新版本的一部分,我们升级到Android Studio 3并引入了Kotlin代码,但我不认为这些与此问题有关.我们没有在构建中使用proguard.
我知道当minSdkVersion为21及以上,与使用ART而不是Dalvik有关时,构建发生了重大变化,所以我想知道三星Lollipop设备是否还有一些缺陷正在寻找现在的主要dex文件?
模块级build.gradle:
import java.text.SimpleDateFormat
import java.util.concurrent.TimeUnit
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'io.fabric'
apply plugin: 'spoon'
// Manifest version information
def versionMajor = 4
def versionMinor = 2
def versionPatch …Run Code Online (Sandbox Code Playgroud)