我要实现,按下按钮后产生一个线程,然后线程 吧消息传给 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);
            }
        };
}}

解决方案 »

  1.   

    Handler不要声明为成员变量试试
    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);
                }
            };
      

  2.   

    tcp_server.this. 不要在本类里面添加这个东西 看起来很怪new Thread() 前面一行添加log 看你点击后 这里是否有响应public void handleMessage(Message msg) {
    在这里添加log 看是否执行 并打印 msg.what
      

  3.   


    我把一些不必要的东东全都删了,后来发现又可以了,但是我加了内容后又不行了额···我在网上看到有些人说:在线程里面不能处理太复杂的事情。我的线程是接收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){.......}里面的
    多谢高手赐教啊!
      

  4.   

    你这个网络的啊 ,估计是 用于接收的时间太长导致,添加时间的log 试试看 看看 
     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 循环搞了好久 。
      

  5.   

    可以了,我只是改了下 那个handle的位置,我把Message m = new Message();
    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)
    }多谢了~~~~