0

我有一个功能function()。当函数被多次调用时,我如何确保它会一个接一个地运行,而不是同时运行?我在 Android Studio 3.5 中使用 Kotlin 1.3。

我的代码是

 button.setOnClickListener{function()}

function()问题是,按钮可以在仍在运行时多次按下,因此我希望后续调用function()顺序执行,一个接一个,而不是同时执行。

编辑:我的函数定义是

fun function(){
    image.animate().rotationBy(360F).setDuration(500)
}

用户可以多次按下按钮,因此结果是图像(image)被旋转到一个角度,因为图像在没有完成完全旋转时再次旋转,最终以另一个角度旋转而不是0°。

4

4 回答 4

1

@Synchronized注释完全符合您的要求:

@Synchronized
private fun function() {
    //...
}
于 2019-10-14T07:01:31.347 回答
0

我建议WorkManager(特别是如果该函数是一些长时间运行的异步作业)将作业排入队列。

  1. 将其添加到 gradle:
implementation "androidx.work:work-runtime-ktx:2.2.0"
  1. 创建包含您的方法(函数)的类
class Task(appContext: Context, workerParams: WorkerParameters) : Worker(appContext, workerParams) {

    override fun doWork(): Result {
        //Call the function
        return Result.success()
    }
}
  1. 使用参数创建作业:
val uploadWorkRequest = OneTimeWorkRequestBuilder<Task>()
.build()
  1. 在按钮单击时将作业排入队列:
WorkManager.getInstance(myContext).enqueue(uploadWorkRequest)
于 2019-10-14T06:12:10.117 回答
0

取布尔值作为hasRan = false

并且在调用函数时,检查hasRan 是否为 false,并在函数结束时设置hasRan = true,仅当 hasRan 的值为 false 时才执行该函数。

这样该函数将只运行一次。

于 2019-10-14T04:21:38.597 回答
-1

您只能从IntentService. IntentService 从主线程卸载任务并在Worker Thread. Worker Thread 中的任务是按顺序执行的。

class SampleIntentService(): IntentService("SampleIntentService") {
override fun onHandleIntent(intent: Intent?) {
//TODO call function() here
 }
}

您可以使用方法启动此服务 startService()

于 2019-10-14T04:19:54.793 回答