一.基础三种线程方式
1.【继承法,耦合度高】定义一个线程:新建一个类继承自Thread,重写父类run方法即可
2. 新建实例对象,通过start()即可执行线程的run操作
2. 【实现接口法】:实现Runnable接口,调用时通过new这个实现的接口对象,再将其传入Thread构造方法再start即可
3. 匿名类方式
- Kotlin直接就打开就行了
二.线程与更新UI
1. 异步消息处理机制介绍:
- Message(传递的消息)
- Handler(处理者,发送和处理消息)
- MessageQueue(消息队列存放消息)
- Looper(执行线程中的message循环,调用Looper的loop()方法后就会进入无限循环,每发现Queue中存在一条消息,就会将其取出)
2. 采用Handler从子线程发送handleMessage回主线程,使用匿名内部类
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_TEXT:
// 在这里可以进行UI操作
text.setText("Nice to meet you");
break;
default:
break;
}
}
};
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message); // 将Message对象发送出去
}
}).start();
3. 子线程中新建Handler方式【不然会报错】
三.使用AsyncTask【抽象类需继承】
//启动任务:
new DownloadTask().execute()
//新建类继承AsyncTask:
class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
//不需要传参给后台任务,进度显示单位为int,使用boolean来反馈执行结果
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(); // 关闭进度对话框
// 在这里提示下载结果
if (result) {
Toast.makeText(context, "Download succeeded",Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(context, " Download failed", Toast.LENGTH_SHORT).show();
}
}
}
四.通过postDelayed进行延时消息
1. View控件进行[Post延时,就是在主线程中的]
- 例一
- 例二
Handler().postDelayed(Runnable {
rotateAnimation!!.start() }, 2000)
2.handler延时
- handler方法其中有send和post两种方法
1)大家常用的send方法,其是在工作线程中处理完耗时操作后调用handler的sendMessage(message)把message对象发送给主线程,在主线程中重写handlerMessage()方法,
2)而post方法传递的是一个runnable对象,更新UI的操作也是在这个runnable的run方法中进行的,也就是说run方法中的代码是执行在主线程中的,虽然它是写在工作线程中,主线程在接收到消息后自动执行runnable的run方法中的代码。)
send和post源码
注解
t