在Android的主线程上有类似信号量的行为

时间:2018-01-28 22:37:18

标签: android multithreading kotlin

我有一个名为showProgress的方法,它运行淡入淡出动画并使用只显示加载微调器(ProgressBar)的页面切换当前视图。

fun showProgress(show: Boolean, progressView: ProgressBar, layoutView: View): Completable {
    val showView = if (show) progressView else layoutView
    val hideView = if (show) layoutView else progressView

    return fadeAnimation(showView, hideView)
}

private fun fadeAnimation(showView: View, hideView: View): Completable {
    return Completable.create {
        //        animateSemaphore.acquire()
        Log.d("beforeFade", "showView: ${showView.visibility}; hideView: ${hideView.visibility}")
        val animTime: Long = showView.context.applicationContext.resources.getInteger(android.R.integer.config_shortAnimTime).toLong()

        showView.alpha = 0f
        handler.post {
            showView.visibility = View.VISIBLE

            showView.animate()
                    .alpha(1f)
                    .setDuration(animTime)
                    .setListener(null)

            hideView.animate()
                    .alpha(0f)
                    .setDuration(animTime)
                    .setListener(object : AnimatorListenerAdapter() {
                        override fun onAnimationEnd(animation: Animator) {
                            hideView.visibility = View.GONE
                            Log.d("fade", "showView: ${showView.visibility}; hideView: ${hideView.visibility}")
                            it.onComplete()
                        }
                    })
        }
    }
}

我在等待网络请求完成RxJava时使用它,我想在应用程序等待请求完成时显示ProgressBar。但是,有时网络请求将在showProgress完成之前返回,并导致动画运行两次,导致progressView和layoutView都设置为View.GONE

我的问题是如何确保在另一个showProgress仍在运行时调用showProgress时,被调用的showProgress将等待一个运行结束?仅仅是一个参考,由于showProgress在主线程上运行,信号量无法正常工作,并且会导致正在运行的showProgress冻结。

0 个答案:

没有答案