关于子线程与主线程与hander通信

子线程不能更新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。

你可能感兴趣的:(关于子线程与主线程与hander通信)