我要实现,按下按钮后产生一个线程,然后线程 吧消息传给 handle ,在handle中设置textview的显示内容,但是我发现,我的不能设置 textview的显示内容,不知道哪里错了,求教~~我的代码很简单,我觉得应该没有是问题的:package com.FJICC.lzm;
import .....
public class tcp_server extends Activity{
private Button serverStart_btn;
private Button serverStop_btn;
private TextView receivedata_tv;
private Button setport_btn;
private EditText senddata_et;
private Button send_btn;
public int PORT = 8080;
public Handler mHandler;
protected static final int GUINOTIFIER = 0x1234;@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.tcpserver_main);
serverStart_btn=(Button)findViewById(R.id.btnStart);
serverStop_btn=(Button)findViewById(R.id.btnStop);
setport_btn=(Button)findViewById(R.id.btnSet);
send_btn=(Button)findViewById(R.id.btnSend);
senddata_et=(EditText)findViewById(R.id.et_send);
receivedata_tv=(TextView)findViewById(R.id.tv_receive); serverStart_btn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
serverStart_btn.setEnabled(false);
setport_btn.setEnabled(false);
serverStop_btn.setEnabled(true);
new Thread()
{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Message m = new Message();
m.what = tcp_server.GUINOTIFIER;
tcp_server.this.mHandler.sendMessage(m);
}catch(IOException e){
e.printStackTrace();
}
}
}.start();
}
}); mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case tcp_server.GUINOTIFIER:
tcp_server.this.receivedata_tv.setText("xxxxxxx");
break;
}
super.handleMessage(msg);
}
};
}}
import .....
public class tcp_server extends Activity{
private Button serverStart_btn;
private Button serverStop_btn;
private TextView receivedata_tv;
private Button setport_btn;
private EditText senddata_et;
private Button send_btn;
public int PORT = 8080;
public Handler mHandler;
protected static final int GUINOTIFIER = 0x1234;@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.tcpserver_main);
serverStart_btn=(Button)findViewById(R.id.btnStart);
serverStop_btn=(Button)findViewById(R.id.btnStop);
setport_btn=(Button)findViewById(R.id.btnSet);
send_btn=(Button)findViewById(R.id.btnSend);
senddata_et=(EditText)findViewById(R.id.et_send);
receivedata_tv=(TextView)findViewById(R.id.tv_receive); serverStart_btn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
serverStart_btn.setEnabled(false);
setport_btn.setEnabled(false);
serverStop_btn.setEnabled(true);
new Thread()
{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Message m = new Message();
m.what = tcp_server.GUINOTIFIER;
tcp_server.this.mHandler.sendMessage(m);
}catch(IOException e){
e.printStackTrace();
}
}
}.start();
}
}); mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case tcp_server.GUINOTIFIER:
tcp_server.this.receivedata_tv.setText("xxxxxxx");
break;
}
super.handleMessage(msg);
}
};
}}
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case tcp_server.GUINOTIFIER:
tcp_server.this.receivedata_tv.setText("xxxxxxx");
break;
}
super.handleMessage(msg);
}
};
在这里添加log 看是否执行 并打印 msg.what
我把一些不必要的东东全都删了,后来发现又可以了,但是我加了内容后又不行了额···我在网上看到有些人说:在线程里面不能处理太复杂的事情。我的线程是接收socket 然后,想把接收到的数据显示到textview里,这个“显示的功能”我就是我要 handle的原因,可视现在好像有点。。
我的代码是这样改的额: serverStart_btn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
serverStart_btn.setEnabled(false);
setport_btn.setEnabled(false);
serverStop_btn.setEnabled(true);
new Thread()
{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
ServerSocket serverSocket=null;
try{
//创建ServerSocket对象监听PORT端口
serverSocket = new ServerSocket(PORT);
//接收tcp连接返回socket对象
Socket socket= serverSocket.accept();
//获得输入流
InputStream inputStream=socket.getInputStream();
//获得输出流
OutputStream outputStream = socket.getOutputStream();
byte []byteBuffer=new byte[1024];
int temp = 0;
//读取接收到的数据
while((temp = inputStream.read(byteBuffer))!=-1)
{
outputStream.write(byteBuffer, 0, temp);
}
//System.out.println(new String(byteBuffer,0,temp));
outputStream.flush();
socket.close();
serverSocket.close();
Message m = new Message();
m.what = tcp_server.GUINOTIFIER;
tcp_server.this.mHandler.sendMessage(m);
}catch(IOException e){
e.printStackTrace();
}
}
}.start();
}
}); mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case tcp_server.GUINOTIFIER://tcp_server是Activity的类名
//得到Handle的通知了 这个时候你可以做相应的操作
receivedata_tv.setText("xxxxxxx");
break;
}
super.handleMessage(msg);
}
};在两个都是在:onCreate(Bundle savedInstanceState){.......}里面的
多谢高手赐教啊!
serverSocket = new ServerSocket(PORT);
//接收tcp连接返回socket对象
Socket socket= serverSocket.accept();
//获得输入流
InputStream inputStream=socket.getInputStream();
//获得输出流
OutputStream outputStream = socket.getOutputStream();
byte []byteBuffer=new byte[1024];
int temp = 0;
//读取接收到的数据
while((temp = inputStream.read(byteBuffer))!=-1)
{
outputStream.write(byteBuffer, 0, temp);
}
//System.out.println(new String(byteBuffer,0,temp));
outputStream.flush();
socket.close();
serverSocket.close();看看这段代码用了多久才完成线程可以做很多工作,但是不能做UI工作。 Message m = new Message();
m.what = tcp_server.GUINOTIFIER;
tcp_server.this.mHandler.sendMessage(m)把这句 先写在
ServerSocket serverSocket=null;
try{
之前 我把那个while 循环搞了好久 。
m.what = tcp_server.GUINOTIFIER;
tcp_server.this.mHandler.sendMessage(m)
放到了 那个while接收里面,就可以了啊~~~while((temp = inputStream.read(byteBuffer))!=-1)
{
outputStream.write(byteBuffer, 0, temp);
Message m = new Message();
m.what = tcp_server.GUINOTIFIER;
tcp_server.this.mHandler.sendMessage(m)
}多谢了~~~~