- 线程的基本用法
- 在子线程中更新UI
- Handler消息异步处理机制
- Handler消息异步处理个人理解
线程用于执行比较耗时的操作。
线程的基本用法有三个(常用第三种)
1、新建类继承Thread,重写父类的run()方法,在里边执行对应的逻辑。使用时,new这个类的实例,调用start()方法。
class MyThread extends Thread {
@Override
public void run() {
//添加事件
}
}
//使用时:
MyThread s = new MyThread();
s.start();
2、新建类实现Runnable接口,实现run()方法。(启动线程时,与第一种方式不同)
class myThread implements Runnable{
@Override
public void run() {
//添加事件
}
}
//使用时
MyThread myThread = new MyThread();
new Thread(myThread).start();
3、不想创建类,可以使用匿名内部类的方式。(常用)
new Thread(new Runnable() {
@Override
public void run() {
//添加事件
}
}).start();
在子线程中更新UI
Android的UI是线程不安全的,即要想改变UI中的元素,必须在主线程中操作,否则就会出现异常。
解决方案:使用Handler消息异步处理机制。
- 定义UPDATE_TEXT常量用于表示更新textview的动作
- 新增一个Handler对象,重写父类的handleMessage()方法,这里对具体的message进行处理(如我们要修改textview的文字)
- 按钮的单击事件:新建一个子线程,创建Message对象,将what字段设置为UPDATE_TEXT,然后调用handler的sendMessage方法。
- (Handler接收到这条message,对携带的what值进行判断,进而进行UI操作)
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final int UPDATE_TEXT = 1;
private Button btn;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
textView = (TextView) findViewById(R.id.textview);
btn.setOnClickListener(this);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_TEXT:
textView.setText("我被更改了!");
Toast.makeText(getApplicationContext(), "我被更改了", Toast.LENGTH_SHORT).show();
break;
}
}
};
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);
}
}).start();
}
}
Handler消息异步处理个人理解
我个人是这么理解的:教室里有相应的规章制度,教室外边的人A不能修改教室里边的规章制度,但是A可以找一个线人来帮忙,A告诉线人,让线人告诉教室里的人,然后教室里的人就可以修改规章制度了。(个人理解,如有错误,不啬赐教!严肃脸.jpg)