小编Mic*_*ott的帖子

从Java调用Kotlin高阶函数

我有一个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中表达这种回调?

java android kotlin

8
推荐指数
1
解决办法
1475
查看次数

在Kotlin中使用Handler编写计时器

我正在尝试在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方法?

android kotlin

5
推荐指数
3
解决办法
9286
查看次数

Android应用程序在Samsung Lollipop设备上崩溃NoClassDefFoundError

我们最近将应用程序的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)

android samsung-mobile android-5.0-lollipop

4
推荐指数
1
解决办法
1023
查看次数