Activity中使用kotlin协程的几种写法

一、AppCompatActivity实现CoroutineScope接口:

class Test1Activity : AppCompatActivity(), CoroutineScope {
    private lateinit var job: Job
    override val coroutineContext: CoroutineContext
        get() = Dispatchers.Main + job

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        job = Job()
        test()
    }

    private fun test() {
        launch {
            val result = withContext(Dispatchers.IO) {
                delay(1000)
                "0"
            }
            Log.d("result", result)
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        job.cancel()
    }
}

二、直接实例化MainScope:

class Test2Activity : AppCompatActivity() {
    private val mailScope = MainScope()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        test()
    }

    private fun test() {
        mailScope.launch {
            val result = withContext(Dispatchers.IO) {
                delay(1000)
                "0"
            }
            Log.d("result", result)
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        mailScope.cancel()
    }
}

三、导入implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.0-alpha02',就可以直接在AppCompatActivity调用lifecycleScope:

class Test3Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        test()
    }

    private fun test() {
        lifecycleScope.launch {
            val result = withContext(Dispatchers.IO) {
                delay(1000)
                "0"
            }
            Log.d("result", result)
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        lifecycleScope.cancel()
    }
}

最后发一下使用协程和RxJava的代码量和可读性对比:

协程:

        dialog.show()
        lifecycleScope.launch {
            val result = withContext(Dispatchers.IO) {
                sendHtmlMail()
            }
            dialog.dismiss()
            if (result == OK) {
                makeText(this@EmailReplyActivity, getString(R.string.mail_send_success_hint))
                finish()
            } else if (result == ERR) {
                makeText(this@EmailReplyActivity, getString(R.string.mail_send_fail_hint))
            }
        }

RxJava:

        dialog.show()
        Observable.create { emitter: ObservableEmitter<String?> ->
            val result = sendHtmlMail()
            emitter.onNext(result)
            emitter.onComplete()
        }.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(object : Observer<String?> {
                    override fun onSubscribe(d: Disposable) {
                        compositeDisposable.add(d)
                    }

                    override fun onNext(value: String?) {
                        if (value.equals(OK)) {
                            makeText(this@EmailReplyActivity, getString(R.string.mail_send_success_hint))
                            finish()
                        } else if (value.equals(ERR)) {
                            makeText(this@EmailReplyActivity, getString(R.string.mail_send_fail_hint))
                        }
                    }

                    override fun onError(e: Throwable) {
                        dialog.dismiss()
                        e.printStackTrace()
                    }

                    override fun onComplete() {
                        dialog.dismiss()
                    }
                })

突然觉得RxJava很恶心有没有

 

 

<think>嗯,用户问的是如何在Kotlin中启动Activity的代码示例。我需要先回忆一下Android开发中Activity跳转的基本方法。记得在Java中,我们通常用Intent来启动新的Activity,比如startActivity(new Intent(currentActivity, TargetActivity.class))。但是在Kotlin中,语法会有些不同,尤其是类引用部分。 首先,用户提供的引用中有几个相关的资料。引用[2]提到使用Intent来启动目标Activity,引用[3]给出了Kotlin的示例代码,使用intent.setClass(this, Main2Activity::class.java),这里需要注意Kotlin中获取Class对象的方式是通过::class.java。另外,引用[4]提到了一个项目示例,可能包含更多上下文,但用户主要需要的是基础代码。 接下来,我需要确保代码正确性。在Kotlin中,启动Activity的基本步骤应该是创建Intent对象,指定当前Activity和目标Activity的类,然后调用startActivity()。可能还需要处理按钮点击事件,所以示例应该包括设置点击监听器。 用户提供的引用[3]中的Kotlin代码有一个函数jump,接收View参数,这可能是通过XML中的onClick属性指定的。但现代Android开发更倾向于使用View Binding或Kotlin Synthetic(已弃用)或者直接设置点击监听器。因此,可能需要两种示例:一种是通过XML的onClick,另一种是在代码中设置监听器。 另外,是否需要显式调用intent.setClass,或者可以使用更简洁的构造方法?比如Intent(this, TargetActivity::class.java)。这样代码会更简洁。 还要注意Kotlin中不需要分号,所以代码格式要正确。同时,确保Activity在AndroidManifest.xml中注册,这是常见的错误点,但用户可能已经知道,不过还是可以提一下。 用户可能还需要知道如何传递数据,所以可以加入putExtra的示例。例如,传递字符串或整数到目标Activity。 总结一下,回答应该包括: 1. 基本的启动Activity代码,使用Intent和startActivity。 2. 两种设置点击事件的方法:XML onClick和代码中设置监听器。 3. 传递数据的示例。 4. 注意事项,如清单文件注册和Kotlin类引用的语法。 需要检查引用中的代码是否正确。例如,引用[3]中的intent.setClass(this, Main2Activity::class.java)是正确的,因为Kotlin中获取Java的Class对象是通过::class.java。另外,startActivity(intent)是正确的。 可能用户是刚接触Kotlin的Android开发者,所以需要解释清楚语法差异,比如::class.java的使用。同时,提到Koin、MVVM等可能不是必要的,但引用[4]中的项目可以作为扩展学习的资源。 最后,生成相关问题,帮助用户深入学习,比如如何传递数据、处理返回结果,或者使用Kotlin扩展库简化代码。</think>在Kotlin中启动Activity的代码实现步骤如下: ### 基础实现代码 ```kotlin // 在MainActivity中设置按钮点击事件 button.setOnClickListener { // 创建显式Intent val intent = Intent(this, TargetActivity::class.java) // 可选参数传递示例 intent.putExtra("KEY_USERNAME", "Android") intent.putExtra("KEY_AGE", 2023) // 启动目标Activity startActivity(intent) } ``` ### XML布局关联方式 若使用XML绑定点击事件,在布局文件中添加: ```xml <Button android:onClick="jumpToActivity" ... /> ``` 对应Kotlin代码: ```kotlin fun jumpToActivity(view: View) { startActivity(Intent(this, TargetActivity::class.java)) } ``` ### 关键点说明 1. **类引用语法**:Kotlin使用`::class.java`获取Java的Class对象,例如`TargetActivity::class.java`[^3] 2. **Intent构造**:推荐使用简化写法`Intent(context, Target::class.java)`替代`intent.setClass()`[^2] 3. **参数传递**:使用`putExtra()`方法携带数据,支持多种数据类型 4. **清单配置**:需在`AndroidManifest.xml`中声明目标Activity[^5] ### 最佳实践建议 - 对于复杂场景,推荐结合`ViewModel`和`LiveData`进行状态管理[^4] - 使用`startActivityForResult`已废弃,建议改用`Activity Result API` - 项目架构可参考包含Kotlin协程+MVVM的现代实现方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值