小编Ben*_*aci的帖子

AsyncTask 作为 kotlin 协程

AsyncTask 的典型用途:我想在另一个线程中运行一个任务,在该任务完成后,我想在我的 UI 线程中执行一些操作,即隐藏进度条。

任务将开始,TextureView.SurfaceTextureListener.onSurfaceTextureAvailable完成后我想隐藏进度条。同步执行此操作不起作用,因为它会阻止构建 UI 的线程,使屏幕变黑,甚至不显示我之后想隐藏的进度条。

到目前为止,我使用这个:

inner class MyTask : AsyncTask<ProgressBar, Void, ProgressBar>() {
    override fun doInBackground(vararg params: ProgressBar?) : ProgressBar {
        // do async
        return params[0]!!
    }

    override fun onPostExecute(result: ProgressBar?) {
        super.onPostExecute(result)
        result?.visibility = View.GONE
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这些课程非常丑陋,所以我想摆脱它们。我想用 kotlin 协程来做到这一点。我尝试了一些变体,但它们似乎都不起作用。我最有可能怀疑的工作是这样的:

runBlocking {
        // do async
}
progressBar.visibility = View.GONE
Run Code Online (Sandbox Code Playgroud)

但这不能正常工作。据我了解,它runBlocking不会像那样启动一个新线程AsyncTask,这正是我需要它做的。但是使用thread协程,我没有看到在完成时得到通知的合理方法。另外,我也不能放入progressBar.visibility = View.GONE新线程,因为只有UI线程才允许进行此类操作。

我是协程的新手,所以我不太明白我在这里缺少什么。

multithreading android android-asynctask kotlin kotlin-coroutines

12
推荐指数
3
解决办法
1万
查看次数

kotlin 嵌套线程 - “在此范围内有多个具有此类名称的标签”

我有一些与此类似的 kotlin 代码:

Thread {
    ...
    Thread {
        ...
        return@Thread
        ...
    }.start()
    ...
}.start()
Run Code Online (Sandbox Code Playgroud)

现在我收到以下警告:

在此处输入图片说明

我知道 kotlin 对此时我想返回哪个线程感到困惑,无论是外线程还是内线程。但我不确定如何告诉它,Android Studio 也没有多大帮助,因为它只建议编辑此警告的选项:

在此处输入图片说明

我尝试命名线程,并认为 kotlin 可能足够聪明来检查它,但我想这可能是不可能的,因为返回标签可能不会在运行时解释。

我意识到我可以将内线程导出到一个函数中,从而使线程不会相互干扰,如下所示:

Thread {
    ...
    startInnerThread()
    ...
}.start()

fun startInnerThread() {
    Thread {
        ...
        return@Thread
        ...
    }.start()
}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有可能以某种方式更改@Thread其中一个的标签。

multithreading kotlin

12
推荐指数
1
解决办法
2515
查看次数

DexArchiveMergerException仅在发布时发布

我开发了一个使用swagger生成的Java客户端的应用程序.客户端位于名为"api"的项目中,而应用程序位于名为"app"的项目中.

当我通过Build/Make Project一切正常建立应用程序.此外,当我尝试在模拟或物理设备上运行应用程序时Run/Run 'app'.运行调试器也可以.即使我通过构建项目Buid/Generate Signed Bundle/APK并选择调试选项,它也可以工作.

现在.当我尝试创建签名版本构建时,构建失败.以下消息显示:

引起:java.lang.RuntimeException:com.android.builder.dexing.DexArchiveMergerException:合并dex存档时出错:[...]\app\build\intermediates\transforms\dexBuilder\release\54,[...]\app\build\intermediates\transforms\externalLibsDexMerger\release\0,[...]\app\build\intermediates\transforms\dexBuilder\release\52.jar,[...]\app\build\intermediates\transforms\dexBuilder \发布\ 53.jar


引起:com.android.builder.dexing.DexArchiveMergerException:合并dex存档时出错:[...]\app\build\intermediates\transforms\dexBuilder\release\54,[...]\app\build\intermediates\transforms\externalLibsDexMerger\release\0,[...]\app\build\intermediates\transforms\dexBuilder\release\52.jar,[...]\app\build\intermediates\transforms\dexBuilder\release\53 .罐


引起:com.android.tools.r8.CompilationFailedException:编译未能完成


引起:com.android.tools.r8.utils.AbortException:错误:程序类型已存在:io.swagger.client.ApiCallback

我很擅长使用android-studio和gradle进行开发,所以可以在这里随意期待初学者的错误.我在Stackoverflow上尝试了一些已经建议添加一些库的解决方案,但到目前为止,它们都没有解决我的问题.

对我来说,它特别怀疑最后一条错误消息指向io.swagger.client.ApiCallback.

这与settings.gradle"api"和"app"都具有相同内容的事实有什么关系吗?两者都是这样的: rootProject.name = "swagger-java-client".这是文件中唯一的一行,但据我所知,settings.gradle"app"已经说明了该内容.我不记得改变它,这对我来说很奇怪它显示"swagger-java-client".这是正常的吗?

更新1: 评论中提到ProGuard可能是个问题.这是我能找到的唯一发现,引用它.在我build.gradle的"app"项目中,有这一部分:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,删除它并没有改变任何东西.

更新2:

搜索"io.swagger"时AS只发现这个: 只找到一场比赛

搜索"io.swagger.client.ApiCallback"AS时,只发现这个: 只找到一场比赛

更新3:

正如所建议的,我尝试添加

android {
    defaultConfig {
        multiDexEnabled true
    }
}
Run Code Online (Sandbox Code Playgroud)

并添加,android.enableD8 = false但也没有帮助.

这是我的build.gradle-Files(第一个引起问题的文件,没有我迄今为止尝试过的建议更正.)

build.gradle(Module:api)(由swagger生成):

apply plugin: 'idea'
apply plugin: 'eclipse'

group = 'io.swagger'
version = …
Run Code Online (Sandbox Code Playgroud)

android build gradle swagger android-studio

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

设置Android Studio预览背景颜色

我正在创建一个自定义视图,该视图应该位于正常布局/视图内的其他视图之上。我希望它是半透明的白色,这样它后面的内容仍然可见,并且我希望它包含完全实心的白色边框和白色字体颜色。在黑色/深色背景上,这很容易阅读。然而,在白色背景的预览中,我看不到任何东西。

有没有办法更改预览的背景颜色,以便我无法测试自定义视图的外观?

如果可能的话,我希望在不添加模仿黑色背景的不必要组件的情况下实现这一目标。

android preview android-custom-view android-studio

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

CDK 部署结果显示“名为“x”的存储桶存在,但不在帐户 067685711111 中。帐户错误?”

我正在修改一个有效的 CDK 管道。我添加了一个 lambda,当进行此代码修改时,管道失败并出现错误。

\n
import * as cdk from \'@aws-cdk/core\';\nimport * as lambda from \'@aws-cdk/aws-lambda\';\nimport * as path from \'path\';\nimport { Rule, Schedule } from \'@aws-cdk/aws-events\';\nimport { LambdaFunction } from \'@aws-cdk/aws-events-targets\';\nimport { Secret } from \'@aws-cdk/aws-secretsmanager\';\nimport { Effect, Policy, PolicyStatement } from \'@aws-cdk/aws-iam\';\n\ninterface LambdaStackProps extends cdk.StackProps {\n    logzioToken: string;\n}\n\nexport class Lambda extends cdk.Stack {\n    constructor(scope: cdk.Construct, id: string, props: LambdaStackProps) {\n        super(scope, id, props);\n\n        const logzioSecret = Secret.fromSecretAttributes(this, \'sv-logzioToken\', {\n            secretPartialArn: props.logzioToken,\n        });\n\n        // Here is the func itself\n …
Run Code Online (Sandbox Code Playgroud)

typescript aws-lambda aws-cdk

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

Kotlin 接口函数作为表达式主体

在 Kotlin 中编写函数时,基本上完全在Thread创建内部实现start(),Android Studio 提供了“转换为表达式主体”的选项

在此处输入图片说明

选择这样做时,kotlin 会将函数转换为表达式主体:

在此处输入图片说明

有没有办法要求一个接口(就像这个函数覆盖的那个)?

我希望接口总是要求validate函数启动一个新的Thread并且只有 (!!) 能够执行里面的东西Thread,而不是方法体本身,因为它只会用于寻址服务器。

我知道我可以通过使用 aabstract class而不是interface这样的方式来强制这种行为:

abstract class ServerValidator<T> {
    fun validate(value: T?, function: ((ValidationResult) -> Unit)) = Thread {
        doValidation(value, function)
    }.start()

    protected abstract fun doValidation(value: T?, function: ((ValidationResult) -> Unit))
}
Run Code Online (Sandbox Code Playgroud)

这样一个继承类将能够覆盖该doValidation函数,而另一个类只能调用validate并因此始终使用新线程。

但是,我特别想知道是否可以使用接口来做这样的事情。

就像是:

interface ServerValidator<T> {
    fun validate(value: T?, function: ((ValidationResult) -> Unit)) = Thread::start
}

// or 

interface ServerValidator<T> { …
Run Code Online (Sandbox Code Playgroud)

interface kotlin

0
推荐指数
1
解决办法
75
查看次数