线程

发布于:2024-05-18 ⋅ 阅读:(78) ⋅ 点赞:(0)

启动线程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() 
  1. 定义一个名为DownloadTask的类,继承自AsyncTaskAsyncTask是一个用于执行后台任务并更新UI的辅助类。它有三个泛型参数:ParamsProgressResult。在这个示例中,我们使用Unit作为Params类型,表示不需要传递任何参数;使用Int作为Progress类型,表示下载进度;使用Boolean作为Result类型,表示下载结果。
  2. 重写doInBackground方法,在这个方法中执行下载任务。我们使用一个无限循环来模拟下载过程,每次循环调用doDownload方法(这个方法需要自己实现)来获取下载进度。然后使用publishProgress方法将下载进度发送到UI线程。当下载进度达到100%时,跳出循环并返回true表示下载成功。如果发生异常,返回false表示下载失败
  3. 重写onProgressUpdate方法,在这个方法中更新进度对话框的消息。我们从values数组中获取下载进度,并将其设置为进度对话框的消息。
  4. 重写onPostExecute方法,在这个方法中根据下载结果显示一个Toast提示。如果下载成功,显示"Download succeeded";如果下载失败,显示"Download failed"。最后,关闭进度对话框。
  5. 这个示例演示了如何使用AsyncTask类来执行后台任务并更新UI。通过使用AsyncTask类,我们可以在后台线程中执行耗时操作,然后将结果发送到UI线程进行更新。这样可以确保UI的更新不会阻塞主线程,从而提高应用程序的性能和响应速度。在实际开发中,我们通常会根据具体需求来选择合适的后台任务执行方式,例如使用AsyncTaskHandlerExecutor等。

总结

在doInBackground中执行耗时任务,由子线程执行。

在onProgressUpdate中执行UI操作。

在onPostExecute执行任务回收工作。

doInBackground() : 核心方法 , 执行异步任务 , 该方法在 子线程 中执行
onPreExecute() : 在 doInBackground() 执行前先执行的方法 , 主线程 中执行 , 可更新 UI 界面
onProgressUpdate() : 调用 publishProgress() 回调的方法 , 主线程 中执行 , 可更新 UI 界面
onPostExecute() : doInBackground() 执行完毕后再执行的方法 , 主线程 中执行 , 可更新 UI 界面


网站公告

今日签到

点亮在社区的每一天
去签到