今天写了一个逻辑:
Runnable sendMyMessage=new Runnable() {
@Override
public void run() {
System.out.println("发送");
try{
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
//out.write("FFi");
out.write(et.getText().toString()+"\n");
out.flush();//不加这个flush会怎样?
if(in.ready()){
String msg=in.readLine();
et.setText("发来消息:"+msg);//一个EditText
System.out.println("发来消息:\n"+msg);
}
}catch (Exception e){
e.printStackTrace();
}
}
};
使用时,把它放到新线程去跑了。
结果抛出了:
android.view.ViewRootImpl$CalledFromWrongThreadException
这个异常。
原因在于安卓只有UI线程(主线程)能更新UI,而这里这个UI不符合安卓的单线程设定,于是抛出异常。
要怎么处理这个问题呢?
可以借助handler的消息循环机制处理,可参见这里: