android4.0后不能再UI主线程中使用socket了,在子线程中使用socket出了问题。可以建立连接,while(true)里的内容都执行不了,不知道为什么啊
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setClass(MainActivity.this, UsbDongleService.class);
bindService(intent,connection,Context.BIND_AUTO_CREATE);
edt = (EditText) findViewById (R.id.editText1);

Thread th = new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
try {
socket = new Socket("192.168.1.55",4800);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
while(true){
Log.d("socket", "1");
//out.print(tv.getText());
if(socket.isConnected()){
if(!socket.isInputShutdown()){
try {
if((recMSG = in.readLine()) != null){
//edt.setText("\n");
Log.d("socket", in.readLine());
socketHandler.sendMessage(socketHandler.obtainMessage());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(servicedata){
Log.d("socket", "output");
servicedata = false;
out.println(tv.getText());
}
}
}
}
}
}
});
th.start();
}

解决方案 »

  1.   

    没看出来啥问题
    socketHandler.sendMessage(socketHandler.obtainMessage());
    obtainMessage方法要参数吗?
      

  2.   

    if((recMSG = in.readLine()) != null){}
    是不是这个地方不动了? 如果服务器没发送数据那就不会动了。
    或者你需要先发送数据给服务器。
      

  3.   


    对,是停在这里了,不过把这里readLine()这一块注释掉后,app一起来就强制关闭了,导致错误的应该是
    out.println(tv.getText());这一句,不知道这一句为什么错了
      

  4.   

    问题解决了,应该是tv.getText()这里的问题
      

  5.   

    子线程里想更新UI,可以用handler来做。