其他分享
首页 > 其他分享> > 传递类类型作为参数并针对Kotlin中的另一个对象检查类型

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

作者:互联网

我正在尝试编写一种方法来等待我的Espresso测试出现某种活动.我已经看到了尝试等待对象出现在不同于测试开始位置的单独活动中的示例,但是到目前为止,没有一个示例对我有用,并且我不希望使用空闲资源来修改我的生产代码.

在我的方法中,我想获取当前活动,然后检查该活动是否是我想要的特定类型的类.我基本上是在修改一些我发现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]
}

解决方法:

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

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

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

标签:kotlin,android-espresso,android
来源: https://codeday.me/bug/20191025/1927030.html