赞
踩
协程 Coroutine 是 Kotlin 语言 中新出现的概念 , 在 Java 语言中没有 ;
协程 是 基于 线程 的 , 是 轻量级 线程 ;
协程主要作用如下 :
异步任务 AsyncTask 也可以处理耗时操作 , 避免耗时任务阻塞线程 , 但是在 Android 11 中 , 官方规定 该 api 已过时 , 被标记为弃用状态 , 建议使用
取代 AsyncTask ;
创建 Android 工程 , 在 Android Studio 中 选择 " 菜单栏 | File | New | New Project " 选项 , 创建工程 ,
创建 Empty Activity ;
注意选择 Kotlin 语言 , Android Studio 会自动添加 Kotlin 语言支持 ;
在 AndroidManifest.xml 清单文件 中 , 添加网络权限 :
<uses-permission android:name="android.permission.INTERNET"/>
Android 中访问网络 , 建议使用 https 协议 , 如果在 Android 中使用 http 协议 , 则需要加入如下网络声明 : 在 res/xml 目录下 , 配置 network_security_config.xml 配置文件 ;
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后在 清单文件中的 application 节点 配置 如下属性 :
android:networkSecurityConfig="@xml/network_security_config"
完整的清单文件配置示例 :
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="kim.hsl.coroutine"> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Coroutine" android:networkSecurityConfig="@xml/network_security_config"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
在 build.gradle 中设置协程依赖 :
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-RC-native-mt'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0-RC-native-mt'
}
布局文件 :
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/asyncTaskButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="异步任务方法" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.2" app:layout_constraintHorizontal_bias="0.5"/> <Button android:id="@+id/coroutineButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="协程方法" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.4" app:layout_constraintHorizontal_bias="0.5"/> </androidx.constraintlayout.widget.ConstraintLayout>
findViewById<Button>(R.id.asyncTaskButton).also { it.setOnClickListener { // 使用异步任务执行耗时操作, // 使用匿名内部类形式定义异步任务 , // Java 匿名内部类 对应 Kotlin 对象表达式 object : AsyncTask<Void, Void, Void>(){ override fun doInBackground(vararg params: Void?): Void? { // 在子线程执行任务 Log.i("MainActivity", "doInBackground : 子线程执行异步任务执行耗时操作") return null } override fun onPostExecute(result: Void?) { super.onPostExecute(result) // 主线程更新 UI Log.i("MainActivity", "onPostExecute : 主线程更新 UI") } }.execute() } }
findViewById<Button>(R.id.coroutineButton).also {
it.setOnClickListener {
// 创建协程
GlobalScope.launch {
// Dispatchers.IO 是协程任务调度器, 用于执行耗时操作
withContext(Dispatchers.IO){
Log.i("MainActivity", "withContext : 协程中执行耗时操作")
}
// 主线程更新 UI
Log.i("MainActivity", "GlobalScope : 主线程更新 UI")
}
}
}
package kim.hsl.coroutine import android.os.AsyncTask import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.Button import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) findViewById<Button>(R.id.asyncTaskButton).also { it.setOnClickListener { // 使用异步任务执行耗时操作, // 使用匿名内部类形式定义异步任务 , // Java 匿名内部类 对应 Kotlin 对象表达式 object : AsyncTask<Void, Void, Void>(){ override fun doInBackground(vararg params: Void?): Void? { // 在子线程执行任务 Log.i("MainActivity", "doInBackground : 子线程执行异步任务执行耗时操作") return null } override fun onPostExecute(result: Void?) { super.onPostExecute(result) // 主线程更新 UI Log.i("MainActivity", "onPostExecute : 主线程更新 UI") } }.execute() } } findViewById<Button>(R.id.coroutineButton).also { it.setOnClickListener { // 创建协程 GlobalScope.launch { // Dispatchers.IO 是协程任务调度器, 用于执行耗时操作 withContext(Dispatchers.IO){ Log.i("MainActivity", "withContext : 协程中执行耗时操作") } // 主线程更新 UI Log.i("MainActivity", "GlobalScope : 主线程更新 UI") } } } } }
异步任务与协程对比 :
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。