-
应用场景:一些耗时操作需要放在子线程中运行,防止主线程被阻塞而影响用户对软件的正常使用
-
用法
-
继承的方式
-
定义一个线程:新建一个继承字Thread的类,重写父类的run方法,在里面编写耗时逻辑
class MyThread extends Thread { @override public void run() { //需要处理的逻辑 } }
-
启动一个线程:new出MyThread实例,调用start方法
new MyThread().start;
-
-
接口的方法
-
定义线程:实现Runnable接口
class MyThread implements Runnable { @override
-
启动线程:
MyThread myThread=new MyThread(); new Thread(myThread).start();
-
-
-
在子线程中更新UI:安卓 不允许在子线程中进行UI操作,需要使用异步消息处理机制解决在子线程中进行UI操作的问题
- 需要用到的类:
- Message:在线程之间传递消息
- Handler:翻译过来是处理者,用来发送和处理消息。
- 发送消息:sendMessage方法
- 处理消息:handleMessage方法
- MessageQueue:消息队列,用于存放所有通过Handler发送的消息,这些消息等待被处理,每个线程只会有一个
- Looper:每个线程中MessageQueue的管家,每个线程只会有一个
- 流程:
- 主线程创建一个Handler对象,并重写handleMessage方法
- 子线程需要进行UI操作时,创建一个Message对象,通过Handler将这条消息发送出去
- 消息被添加到MessageQueue队列中等待被处理
- Looper取出待处理的消息,发到Handler的handleMessage中,主线程进行UI操作
- 封装好的工具:AsyncTask:实现原理也是基于异步消息处理机制
- 用法
-
创建一个子类,继承自AsyncTask。需要指定三个泛型参数
-
Params:在后台任务中使用
-
progress:后台任务执行的进度
-
result:返回值类型
class DownloadTask extends AsyncTask<Void,Integer,Boolean> { //第一个泛型参数为Void,表示执行AsyncTask的时候不需要传入参数给后台任务 //第二个泛型参数为Integer,表示使用整型数据来作为进度显示单位 //第三个泛型参数为Boolean,表示使用布尔型数据来反馈执行结果 }
-
-
重写方法
-
onPreExecute:在后台人物开始执行之前调用,用于界面初始化
-
doInBackground:该方法中所有的代码在子线程中运行,用于处理耗时任务
-
onProgressUpdate:接受从后台传递的数据,根据这些数据对界面元素进行更新。
-
onPostExecute:后台任务执行完毕并通过return语句进行返回时调用,用于收尾工作
class DownloadTask extends AsyncTask<Void,Integer,Boolean> { @override protected void onPreExecute() { progressDialog.show();//显示进度对话框 } @override protected Boolean doInBackground(Void... params) { try { while(true) { int downloadPercent=doDownload();//自定义的方法,计算当前下载进度并返回,在子线程中执行 publishProgress(downloadPercent); if(downloadPercent>=100){ break; } } } catch(Exception e) { return false; } return true; } @override protected void onProgressUpdate(Integer... values) { //更新下载进度 progressDialog.setMessage("downloaded"+values[0]+"%"); } @override protected void onPostExecute(Boolean result) { progressDialog.dismiss(); } }
-
-
- 用法
- 需要用到的类:
安卓多线程编程
最新推荐文章于 2024-07-31 19:38:21 发布