启动线程1(Runnable)
class Mythread:Runnable{
override fun run() {
// 逻辑
}
}
fun main(){
val mythread = Mythread()
Thread(mythread).start()
}
启动线程2
Thread{
// 逻辑
}.start()
启动线程3
thread {
// 逻辑
}
异步处理
class MainActivity : AppCompatActivity() {
val updateText = 1
val handler = object : Handler(Looper.getMaininLooper()) {
override fun handleMessage(msg: Message) {
when (msg.what) {
updateText -> textView.text = "Nice to meet you"
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
changeTextBtn.setOnClickListener {
thread {
val msg = Message()
msg.what = updateText
handler.sendMessage(msg) // Message
}
}
}
}
Message
Message
类是一个轻量级的数据结构,用于在线程之间传递数据和消息。上述案例的Message
类有一个what
字段,用于表示消息的类型。这个字段是一个整数,可以用来区分不同类型的消息。在处理消息时,可以根据what
字段的值来执行相应的操作。
Handler
可以进行进程间的接收和发送消息
MessageQueue
存放信息的队列
Looper
管理队列,取出队列的消息。循环处理。
AsyncTask
class DownloadTask : AsyncTask<Unit, Int, Boolean>() {
override fun onPreExecute() {
progressDialog.show()
}
override fun doInBackground(vararg params: Unit?) = try {
while (true) {
val downloadPercent = doDownload()
publishProgress(downloadPercent)
if (downloadPercent >= 100) {
break
}
}
true
} catch (e: Exception) {
false
}
override fun onProgressUpdate(vararg values: Int?) {
progressDialog.setMessage("Downloaded ${values[0]}%")
}
override fun onPostExecute(result: Boolean) {
progressDialog.dismiss()
if (result) {
Toast.makeText(context, "Download succeeded", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(context, " Download failed", Toast.LENGTH_SHORT).show()
}
}
}
DownloadTask().execute()
- 定义一个名为
DownloadTask
的类,继承自AsyncTask
。AsyncTask
是一个用于执行后台任务并更新UI的辅助类。它有三个泛型参数:Params
、Progress
和Result
。在这个示例中,我们使用Unit
作为Params
类型,表示不需要传递任何参数;使用Int
作为Progress
类型,表示下载进度;使用Boolean
作为Result
类型,表示下载结果。 - 重写
doInBackground
方法,在这个方法中执行下载任务。我们使用一个无限循环来模拟下载过程,每次循环调用doDownload
方法(这个方法需要自己实现)来获取下载进度。然后使用publishProgress
方法将下载进度发送到UI线程。当下载进度达到100%时,跳出循环并返回true
表示下载成功。如果发生异常,返回false
表示下载失败 - 重写
onProgressUpdate
方法,在这个方法中更新进度对话框的消息。我们从values
数组中获取下载进度,并将其设置为进度对话框的消息。 - 重写
onPostExecute
方法,在这个方法中根据下载结果显示一个Toast提示。如果下载成功,显示"Download succeeded";如果下载失败,显示"Download failed"。最后,关闭进度对话框。 - 这个示例演示了如何使用
AsyncTask
类来执行后台任务并更新UI。通过使用AsyncTask
类,我们可以在后台线程中执行耗时操作,然后将结果发送到UI线程进行更新。这样可以确保UI的更新不会阻塞主线程,从而提高应用程序的性能和响应速度。在实际开发中,我们通常会根据具体需求来选择合适的后台任务执行方式,例如使用AsyncTask
、Handler
、Executor
等。
总结
在doInBackground中执行耗时任务,由子线程执行。
在onProgressUpdate中执行UI操作。
在onPostExecute执行任务回收工作。
doInBackground() : 核心方法 , 执行异步任务 , 该方法在 子线程 中执行
onPreExecute() : 在 doInBackground() 执行前先执行的方法 , 主线程 中执行 , 可更新 UI 界面
onProgressUpdate() : 调用 publishProgress() 回调的方法 , 主线程 中执行 , 可更新 UI 界面
onPostExecute() : doInBackground() 执行完毕后再执行的方法 , 主线程 中执行 , 可更新 UI 界面