Android中同步异步任务

32 篇文章 2 订阅
16 篇文章 0 订阅

一、前言

​ 在实际开发中会出现这种场景,有多个接口请求数据,需要等到这几个接口都请求完后再执行后面的任务。大部分情况下接口网络操作都封装完成,只有一共回调可供操作,这里使用CountDownLatch、CyclicBarrier来进行处理。

二、代码演示

​ 这里使用点击事件简化演示程序。代码如下(解开注释可以看到同样的结果):

package com.example.helloworld

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import java.util.concurrent.CountDownLatch
import java.util.concurrent.CyclicBarrier

//测试两次点击都出结果后再执行最后的逻辑
class MainActivity : AppCompatActivity() {

    private val TAG = "YM-->${javaClass.name}"

//    private val countDownLatch = CountDownLatch(2)
    private val cyclicBarrier = CyclicBarrier(2){
        finally()
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
//        Thread { finally() }.start()
    }

    fun onClick(v: View){
        when(v.id){
            R.id.one -> {
                one()
            }

            R.id.two -> {
                two()
            }

        }
    }

    private fun one(){
//        Thread{
//            Log.d(TAG,"---->one")
//            countDownLatch.countDown()
//        }.start()
        Thread{
            Log.d(TAG,"---->one")
            cyclicBarrier.await()
        }.start()
    }

    private fun two(){
//        Thread{
//            Log.d(TAG,"---->two")
//            countDownLatch.countDown()
//        }.start()
        Thread{
            Log.d(TAG,"---->two")
            cyclicBarrier.await()
        }.start()
    }


    private fun finally(){
//       countDownLatch.await()
       Log.d(TAG,"---->执行最后的逻辑")
    }

}

三、附录Semaphore(信号量)

有一种场景是上面两种方式都无法实现的,这时候需要使用信号量来处理。
假如两种任务同时等待一个资源,这时候可以使用信号量来处理。举个例子就是,有两个动画需要执行,但是每一个动画执行的时候都需要在没有任何动画执行时候执行。这时候就可以引申出公共资源的问题。如果用常规的锁会比较麻烦。这里可以使用信号量来处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值