kotlin.runCatching()用法

kotlin.runCatching()用法

private fun doDelayAppUse(activity: Activity) {
        viewModelScope.launch {
            kotlin.runCatching {
                Result.success(
                    PhoneDataManager.instance().applyAppDelayUse(ApplyDelayAppBean().apply {
                        deviceId = DeviceInfoUtils.getChipId(activity)
                        pkgName = mPkgName
                        minute = _selectTimeInMinutes
                        appName = mAppName
                    })
                )
            }.onSuccess {
                it.onSuccess { response ->
                    if (response.isSuccessful) {
                        setApplyTimestamp(
                            activity,
                            mPkgName,
                            System.currentTimeMillis()
                        )
                    } else {
                        onError(response.code, response.message)
                    }
                    Toast.makeText(activity, response.message, Toast.LENGTH_SHORT).show()
                }
                knowBtnClick(activity)
            }.onFailure {
                onFailure(it, activity)
                knowBtnClick(activity)
            }
        }
    }

PhoneDataManager.kt

override suspend fun applyAppDelayUse(applyDelayAppBean: ApplyDelayAppBean): ResponseBean<Void> {
        return mRemoteRepository.applyAppDelayUse(applyDelayAppBean)
}

Result.kt

public value class Result<out T> @PublishedApi internal constructor(
    @PublishedApi
    internal val value: Any?
) : Serializable {
    // discovery

    /**
     * Returns `true` if this instance represents a successful outcome.
     * In this case [isFailure] returns `false`.
     */
    public val isSuccess: Boolean get() = value !is Failure

    /**
     * Returns `true` if this instance represents a failed outcome.
     * In this case [isSuccess] returns `false`.
     */
    public val isFailure: Boolean get() = value is Failure

    // companion with constructors

    /**
     * Companion object for [Result] class that contains its constructor functions
     * [success] and [failure].
     */
    public companion object {
        /**
         * Returns an instance that encapsulates the given [value] as successful value.
         */
        @Suppress("INAPPLICABLE_JVM_NAME")
        @InlineOnly
        @JvmName("success")
        public inline fun <T> success(value: T): Result<T> =
            Result(value)

        /**
         * Returns an instance that encapsulates the given [Throwable] [exception] as failure.
         */
        @Suppress("INAPPLICABLE_JVM_NAME")
        @InlineOnly
        @JvmName("failure")
        public inline fun <T> failure(exception: Throwable): Result<T> =
            Result(createFailure(exception))
    }

    internal class Failure(
        @JvmField
        val exception: Throwable
    ) : Serializable {
        override fun equals(other: Any?): Boolean = other is Failure && exception == other.exception
        override fun hashCode(): Int = exception.hashCode()
        override fun toString(): String = "Failure($exception)"
    }
}

@PublishedApi
@SinceKotlin("1.3")
internal fun createFailure(exception: Throwable): Any =
    Result.Failure(exception)
    
    
@InlineOnly
@SinceKotlin("1.3")
public inline fun <T> Result<T>.onFailure(action: (exception: Throwable) -> Unit): Result<T> {
    contract {
        callsInPlace(action, InvocationKind.AT_MOST_ONCE)
    }
    exceptionOrNull()?.let { action(it) }
    return this
}

/**
 * Performs the given [action] on the encapsulated value if this instance represents [success][Result.isSuccess].
 * Returns the original `Result` unchanged.
 */
@InlineOnly
@SinceKotlin("1.3")
public inline fun <T> Result<T>.onSuccess(action: (value: T) -> Unit): Result<T> {
    contract {
        callsInPlace(action, InvocationKind.AT_MOST_ONCE)
    }
    if (isSuccess) action(value as T)
    return this
}    

kotlin.runCatching

@InlineOnly
@SinceKotlin("1.3")
public inline fun <R> runCatching(block: () -> R): Result<R> {
    return try {
        Result.success(block())
    } catch (e: Throwable) {
        Result.failure(e)
    }
}

block: () -> R 传入的就是doDelayAppUse方法中viewModelScope.launch代码块中的内容

1. block执行完毕后:

如果没有异常就返回Result<Result<ResponseBean<Void>>>

如果有异常就返回Result<Failure<Throwable>>

2. kotlin.runCatching {}执行完毕后返回Result对象, 紧接着调用onSucess

public inline fun <T> Result<T>.onSuccess(action: (value: T) -> Unit): Result<T> {
    contract {
        callsInPlace(action, InvocationKind.AT_MOST_ONCE)
    }
    if (isSuccess) action(value as T)
    return this
}

如果Result中的value 不是Failure对象就执行action

public val isSuccess: Boolean get() = value !is Failure

3. onSuccess执行完毕后再执行onFailure

public inline fun <T> Result<T>.onFailure(action: (exception: Throwable) -> Unit): Result<T> {
    contract {
        callsInPlace(action, InvocationKind.AT_MOST_ONCE)
    }
    exceptionOrNull()?.let { action(it) }
    return this
}

如果Result中的value是Failure就执行action

<think>嗯,用户遇到了Gradle Kotlin编译的问题,具体是关于org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction的。首先,我需要理解这个类的作用。根据经验,这个类应该和Kotlin编译器在Gradle中的工作线程有关,可能涉及并行编译或者工作进程的管理。 用户的问题可能出现在编译过程中,比如版本不兼容、配置错误或者依赖问题。首先,我应该检查常见的错误原因,比如Gradle和Kotlin插件的版本是否匹配。用户可能没有正确升级到推荐的版本组合,比如Gradle 8.2.1和Kotlin 1.8.20,或者使用的版本之间存在已知的不兼容问题。 接下来,用户可能在build.gradle.kts中配置了某些任务,比如打包任务,引用了旧的配置方式。例如,用户提供的代码中使用了tasks.jar块,里面引用了configurations.runtimeClasspath。这可能在较新的Gradle版本中有所变化,需要确认是否正确使用了新的API,或者是否需要调整依赖配置的方式。 另外,并行编译或增量编译的设置也可能导致问题。有时候禁用这些功能可以暂时解决问题,帮助定位错误来源。用户可能需要调整Gradle属性,比如org.gradle.parallel或者kotlin.incremental。 还有可能的问题包括依赖冲突或缓存问题。用户可能需要清理Gradle缓存,或者检查依赖树中是否有冲突的库版本。使用./gradlew dependencies命令可以帮助分析依赖关系。 错误日志也是关键,用户需要提供具体的堆栈跟踪或错误信息,才能更准确地定位问题。如果用户没有提供,可能需要指导他们如何启用更详细的日志,比如使用--stacktrace或--debug选项运行构建。 最后,可能需要参考官方文档或社区资源,比如Kotlin的GitHub issues或者Gradle官方指南,看看是否有已知的问题或解决方案。例如,用户提供的引用[2]中的打包配置可能需要更新,以适应新的Gradle版本或Kotlin插件的变化。 总结下来,我需要分步骤引导用户检查版本兼容性、构建脚本配置、编译选项、依赖管理以及缓存清理等方面,同时建议他们提供具体的错误信息以便进一步分析。</think>### Gradle Kotlin CompilerRunnerWithWorkers问题解析 #### 一、问题定位 `GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction`是Kotlin Gradle插件内部实现编译任务的核心类,主要与Kotlin编译器工作进程管理相关。典型错误场景包括: 1. 插件版本与Gradle版本不匹配(如Kotlin 1.8+需要Gradle 7.6+) 2. 增量编译配置冲突 3. 并行编译任务异常 4. 依赖解析异常[^2] #### 二、关键排查步骤 ###### 1. 版本兼容性验证 在`gradle.properties`中确保版本对应关系: ```properties kotlin.version=1.8.20 agp.version=8.1.0 gradle.version=8.2.1 ``` > 官方建议组合:Kotlin 1.8.x + Gradle 8.x[^1] ###### 2. 编译参数配置 在`build.gradle.kts`中增加调试参数: ```kotlin tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { kotlinOptions { freeCompilerArgs = listOf("-Xdebug", "-Xno-param-assertions") jvmTarget = "17" } } ``` ###### 3. 工作进程配置 ```properties # gradle.properties kotlin.experimental.tryK2=true kotlin.parallel.tasks.in.project=true org.gradle.workers.max=4 ``` #### 三、典型错误解决方案 **案例:`Failed to create work action`错误** ```log Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: Failed to create work action for GradleKotlinCompilerWorkAction ``` **修复方案:** 1. 清理构建缓存 ```bash ./gradlew clean --refresh-dependencies ``` 2. 禁用并行编译(临时测试) ```properties org.gradle.parallel=false ``` #### 四、高级调试方法 ```bash # 获取详细堆栈跟踪 ./gradlew assembleDebug --stacktrace --scan # 输出编译器参数 ./gradlew compileKotlin -Pkotlin.compiler.execution.strategy="in-process" -i ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值