Kotlin协程

class MainActivity : BaseActivity<ActivityMainBinding?>() {
    override fun dispatchTouchEvent(event: MotionEvent): Boolean {
        Log.i(TAG, "dispatchTouchEvent: " + Util.getMotionEvenActionName(event.action))
        return super.dispatchTouchEvent(event)
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        Log.i(TAG, "onTouchEvent: " + Util.getMotionEvenActionName(event.action))
        return super.onTouchEvent(event)
    }

    override fun getLayoutId(): Int {
        return R.layout.activity_main
    }

    override fun init() {

        testCoroutine()

        mViewBinding!!.button.setOnClickListener { v: View? ->
            Log.i(TAG, "button: ")
            startActivity(Intent(this@MainActivity, SecActivity::class.java))
        }
        //        mViewBinding.linerlayout.setOnClickListener(v -> {
//            Log.i(TAG, "linerlayout: ");
//            startActivity(new Intent(MainActivity.this, SecActivity.class));
//        });
        val options = BitmapFactory.Options()
        options.inJustDecodeBounds = true
        mViewBinding!!.button2.setOnClickListener { v: View? ->
            AlertDialog.Builder(this@MainActivity)
                .setMessage("111")
                .create()
                .show()
        }
        mViewBinding!!.button2.setOnClickListener { v: View? ->
            Log.d("xcyxch", "onclick --->")
            //            startActivity(new Intent(MainActivity.this, ThirdActivity.class));
            Glide.with(this@MainActivity).asBitmap()
                .load("https://upload.jianshu.io/users/upload_avatars/2761586/b8d3cd7925eb.jpeg?imageMogr2/auto-orient/strip|imageView2/1/w/90/h/90/format/webp")
                .into(object : SimpleTarget<Bitmap?>() {

                    override fun onLoadFailed(errorDrawable: Drawable?) {
                        super.onLoadFailed(errorDrawable)
                        Log.d(TAG, "onLoadFailed ")
                    }

                    override fun onResourceReady(
                        resource: Bitmap,
                        transition: Transition<in Bitmap?>?
                    ) {
                        Util.showShortCut(
                            this@MainActivity,
                            resource,
                            "groupId_001",
                            "group_nickName",
                            "nickname"
                        )
                    }
                })
        }
        mViewBinding!!.testButton01.setOnClickListener { v: View? ->
            startActivity(
                Intent(
                    this@MainActivity,
                    FourthActivity::class.java
                )
            )
        }
        val proxyClass = Proxy.getProxyClass(
            UserManager::class.java.classLoader, *arrayOf<Class<*>>(
                UserManager::class.java
            )
        )


//        UserManager userManager = new UserManagerProxy(new UserManagerImpl());
//        userManager.addUser("xcy");
//        userManager.deleteUser("xcy");
        val userManager = LogHandler().newInstance(UserManagerImpl()) as UserManager
        userManager.addUser("xcy")
        userManager.deleteUser("xcy")
        val myViewModel = ViewModelProvider(this@MainActivity).get(
            MyViewModel::class.java
        )
        Log.i(TAG, "init myViewModel: " + getObjName(myViewModel))
    }

    private fun testCoroutine() {
//        testCoroutineRunBlocking()

        testGlobalScopeLaunch()
    }

    private fun testGlobalScopeLaunch() {
//        testCoroutineStart()
//
//        testAsync()

//        testWithContext()

//        testWithContextLeeDuo()

//        testChannelInCoroutines()

        testJobJoin()
    }

    private fun testJobJoin() {
        GlobalScope.launch {
            val myJob1: Job = GlobalScope.launch {//GlobalScope.launch开启协程 协程不阻塞当前线程 并计时1s
                delay(2000)
                log("Kotlin Coroutines 111")
            }
            val myJob2: Job = GlobalScope.launch {//GlobalScope.launch开启协程 协程不阻塞当前线程 并计时1s
                delay(1500)
                log("Kotlin Coroutines 222")
            }
            val myJob3: Job = GlobalScope.launch {//GlobalScope.launch开启协程 协程不阻塞当前线程 并计时1s
                delay(1000)
                log("Kotlin Coroutines 333")
            }
            log("hello")// 主线程继续执行 输出hello
//            myJob1.join() // myJob.join() 挂起协程(GlobalScope.launch创建的协程) 直到myJob执行完毕
//            myJob2.join() // myJob.join() 挂起协程(GlobalScope.launch创建的协程) 直到myJob执行完毕
//            myJob3.join() // myJob.join() 挂起协程(GlobalScope.launch创建的协程) 直到myJob执行完毕
            log("world")
        }
    }

    private fun testChannelInCoroutines() {
        // 创建
        val channel = Channel<Int>()

        val producer = GlobalScope.launch {
            var i = 0
            while (!channel.isClosedForSend) {
                log("begin send channel isClosedForSend ${channel.isClosedForSend}")
                // 发送
                channel.send(i++)
                delay(1000)
                // channel不需要时要及时关闭
                if (i == 5) {
                    channel.close()
                    log("after close send channel isClosedForSend ${channel.isClosedForSend}")
                    return@launch
                }
            }
        }

        // 写法1:常规
//        val consumer = GlobalScope.launch {
//            while (!channel.isClosedForReceive) {
//                // 接收
//                val element = channel.receive()
//                if (element == 9) {
//                    break;
//                }
//                log("liduo", "$element")
//            }
//        }

        // 写法2:迭代器
//        val consumer = GlobalScope.launch {
//            val iterator = channel.iterator()
//            while(iterator.hasNext()){
//                // 接收
//                val element = iterator.next()
//                log("liduo", "$element")
//            }
//        }

        // 写法3:增强for循环
        val consumer = GlobalScope.launch {
            for(element in channel){
                log("liduo", "$element")
            }
        }


        // 启动协程,返回一个接收Channel
        val receiveChannel: ReceiveChannel<Int> = GlobalScope.produce {
            while(true){
                delay(100)
                // 发送
                send(1)
            }
        }
    }

    private fun testCoroutineStart() {
        val jobLazy = GlobalScope.launch(context = Dispatchers.Main, start = CoroutineStart.LAZY) {
            log("testGlobalScopeLaunch inner LAZY")
        }
        log("before start job lazy")

        val jobDefault =
            GlobalScope.launch(context = Dispatchers.Main, start = CoroutineStart.DEFAULT) {
                log("testGlobalScopeLaunch inner DEFAULT")
            }
        log("below start job default")

        jobDefault.start()
        jobLazy.start()
    }

    private fun testAsync() {
        GlobalScope.launch(Dispatchers.Main) {
            log("before 声明 async")
            val deferred1 = GlobalScope.async {
                log("testGlobalScopeLaunch async inner 11")
                delay(200)
                3
            }
            val deferred2 = GlobalScope.async {
                log("testGlobalScopeLaunch async inner 22")
                delay(200)
                3
            }
            val deferred3 = GlobalScope.async {
                log("testGlobalScopeLaunch async inner 33")
                delay(200)
                3
            }
            log("before invoke await")
            log("deferred1.await(): ${deferred1.await()}")
            log("deferred2.await(): ${deferred2.await()}")
            log("deferred3.await(): ${deferred3.await()}")

        }
    }

    private fun testWithContext() {
        GlobalScope.launch {
            val result1 = withContext(Dispatchers.IO) {
                log("testGlobalScopeLaunch withContext1 inner 11")
                delay(200)
                3
            }
            val r2 = withContext(Dispatchers.IO) {
                log("testGlobalScopeLaunch withContext1 inner 22")
                delay(200)
                3
            }
            val r3 = withContext(Dispatchers.IO) {
                log("testGlobalScopeLaunch withContext1 inner 33")
                delay(200)
                3
            }
            log("before invoke with context")
            log("withContext1: $result1")
            log("withContext2: $r2")
            log("withContext3: $r3")

        }
    }

    private fun testWithContextLeeDuo() {
        // IO线程启动并执行,启动模式DEFAULT
        GlobalScope.launch(Dispatchers.IO) {
            log("liduo", "start")
            // 线程主切换并挂起,泛型可省略,自动推断
            val result = withContext<String>(Dispatchers.Main) {
                // 网络请求
                log("Dispatchers.main")
                "json data"
            }
            // 切换回IO线程
            log("liduo", result)
        }
    }


    private fun testCoroutineRunBlocking() {
        log("before blocking")
        runBlocking {
            log("in blocking")
    //            val coroutineScope = CoroutineScope(Dispatchers.Main)
    //            var job = CoroutineScope(Dispatchers.Main).launch(Dispatchers.IO) {
            launch(Dispatchers.IO) {
                log("scope io")
                launch(Dispatchers.Main) {
                    log("scope mian")

                }
    //            }
            }
    //            job.join()
        }
    }

    fun log(vararg msg: String?) {
        Log.d("coroutine-log", "[${Thread.currentThread().name}]:${msg.toList()}")
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值