子线程不能更新ui,主线程不能做耗时操作。
操做流程是
子线程耗时完毕传给handler sendmessage再传给messageQueue再给Looper最后传给UI线程。
arg1/arg2传递整数型。
obj传输大部分。
what属性判断。
通过time=Integer.
parseInt(
ed1.getText().toString());获取edittext中的内容并转换为整数型。
具体代码为
public Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); tv1.setText(msg.what+""); }};
bt1.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
time=Integer.
parseInt(
ed1.getText().toString());
new Thread(
new Runnable() {
@Override
public void run() {
for (
int i=
time;i>
0;i--){ Message message=
handler.obtainMessage(); message.
what=i;
handler.sendMessage(message);
try { Thread.
sleep(
1000); }
catch (InterruptedException e){ e.printStackTrace(); } } } }).start(); }});
使用Hander的步骤是
在UI线程中创建Hander匿名内部类;
在匿名内部类中重写handderMessage方法;
在UI线程中启动子线程;
在线程中获得Message对象;
将需要传递的数据赋值到Message对象中;
通过Hander对象的sendMessage方法发送消息到消息阵列;
在handleMessage方法中接收消息。
Looper就是让线程不停的循环工作让普通线程成为循环线程。
当创建Loooper时系统会自动创建一个MessageQueue。
一个线程中只会存在一个Looper和一个MessageQueue。