Android学习笔记之线程中调用UI控件
今天做了一个TCP和UDP通信的测试,其中使用到两个线程,一个用来监听tcp,另一个用来监听UDP.
首先在线程中使用死循环来时刻监听数据,Socket,ServerSocket,DatagramSocket这些就不说了,网上很多例子
在收到消息的时候我需要把消息推送到界面上,由于在线程中操作UI控件,百度了好几种方法,照抄来都用了一遍,其中很方便的View.Post
UI控件基本都有这个功能,比如我在得到数据后要抛给界面,界面有个TextView叫TxtEdit
于是
TxtEdit.post(new Runnable(){public void run(){ Log.d("UDP", "发送完毕,清空文本框"); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date=sdf.format(new java.util.Date()); TxtInfo.setText(TxtInfo.getText()+"\r\n"+date+"\t\r\n"+str); TxtEdit.setText(""); Toast.makeText(getApplicationContext(), "发送成功!", Toast.LENGTH_LONG).show(); } });
方法很简单,
TxtEdit.post(new Runnable(){public void run(){ // TODO 添加需要执行的界面操作 } });
另一种方法是用Handler
protected Handler uiHandler=new Handler(){ @Override public void handleMessage(Message msg) { Log.d("收到消息", "更新界面"); TxtInfo.setText(msg.obj.toString()); super.handleMessage(msg); } };
当然,在收到消息的时候就需要向这个Handler发送一个消息了:
Message msg=new Message(); msg.obj=TxtInfo.getText();//obj参数是需要处理的消息内容 uiHandler.sendMessage(msg);
这样就返回主线程来处理消息了
Message有很多用法,参考http://www.cnblogs.com/over140/archive/2011/06/24/2088637.html