一、线程基本使用
- 继承的方式: 线程继承于Thread类,重写run()方法,并在里面写耗时逻辑
class MyThread extends Thread{
@Override
public void run () {
// 具体逻辑
}
}
启动线程:
new 出实例,调用start方法
new MyThread().start()
- 实现Runnable接口方式
class MyThread implement Runnale {
@Override
public void run () {
}
}
启动线程:
MyThread myThread = new MyThread();
new Thread(myThread).start();
- Runnable接口匿名类(最简,常见写法)
new Thread(new Runnable() {
@Override
public void run () {
// 处理具体逻辑
}
}).start();
二、子线程中更新UI
UI是线程不安全的,必须在主线程更新UI,否则出现异常报错
- 新建 Button 和 TextView 控件
在点击Button新建线程
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.button: {
new Thread(new Runnable() {
@Override
public void run() {
text.setText("Nice to meet you");
}
}).start();
break;
}
}
}
以上逻辑会报错,不允许子线程操作UI
- 修改MainActivity代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
publlic static final int UPDATE_TEXT = 1;
private TextView text;
private Handle handler = new Handler() {
public void handleMessage (Message msg) {
switch(msg.what) {
case UPDATE_TEXT:
// UI操作
text.setText("Nice to meet you");
break;
}
}
}
}
...
// 在click事件的Thread中:
@Override
public void run () {
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message); // Message发送出去
}
完成子线程传递消息给主线程,然后更新UI的功能