UI线程如何向子线程发送数据呢?答案:可以通过Handler。
Handler用于处理其它线程发送来的消息。如果Handler于在主线程中,因为主线程默认有了一个消息队列,所以不用显式使用Looper。如果Handler用于自己建立的线程中,需要自己创建队列,来接收其它线程发送来的消息。
下面的例子Hander 对象实现在自定义的线程中。
此处需要注意looper的用法,在自定义的线程中,没有looper管理消息队列来接收消息,所以需要使用Looper.prepare();
public class MainActivity extends Activity {
private Button button;
private Handler myhandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button1);
new Thread(new Runnable1()).start();
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Message message = Message.obtain();
message.arg1 = 1;
myhandler.sendMessage(message);
}
});
}
class Runnable1 implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
Looper.prepare();// 循环消息队列
myhandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
System.out.println(msg.arg1);
}
};
Looper.loop();// 直到消息队列循环结果
}
}
}