将类类型作为参数传递,并在Kotlin中针对另一个对象检查类型

时间:2018-04-16 15:12:23

标签: android kotlin android-espresso

我正在尝试编写一种方法来等待我的Espresso测试中出现的某种活动。我已经看到了试图等待对象出现在单独活动上的例子,而不是测试开始的例子,但到目前为止,没有一个对我有效,而且我并不热衷于用空闲资源修改我的生产代码。 / p>

在我的方法中,我想获取当前活动,然后检查活动是否是我想要的特定班级类型。我基本上修改了一些代码,我发现here可以使用Kotlin和泛型类。不幸的是,我不知道如何格式化传入的参数(目前Class<out Activity>)或我在if语句中不正确地使用它。下面写的内容没有编译。

关于如何将我想要的活动类型作为参数传递给waitForActivity方法以及如何检查它的任何指针?

fun waitForActivity(activityType: Class<out Activity>, timeout: Int = 10): Boolean {
    val endTime = System.currentTimeMillis() + (timeout * 1000)

    do {
        val currentActivity = getActivityInstance()

        // THIS LINE IS MY ISSUE **********************************************
        if(currentActivity != null && currentActivity::class.java is activityType)
            return true
        // ********************************************************************

        SystemClock.sleep(100)
    } while (System.currentTimeMillis() < endTime)
    return false
}

private fun getActivityInstance(): Activity? {
    val activity = arrayOfNulls<Activity>(1)
    InstrumentationRegistry.getInstrumentation().runOnMainSync {
        val currentActivity: Activity?
        val resumedActivities = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED)
        if (resumedActivities.iterator().hasNext()) {
            currentActivity = resumedActivities.iterator().next() as Activity
            activity[0] = currentActivity
        }
    }
    return activity[0]
}

1 个答案:

答案 0 :(得分:4)

您可以使用Class.isInstance替换整行。

if (activityType.isInstance(currentActivity)) { ... }

在Kotlin中,is需要一个类名(在编译时,您也不能使用String) - 而不是Class实例。 Class.isInstance用于使用Class实例执行相同的检查。