解决了在Android 2.3下能够正常连接socket,而Android 4.4下却崩溃的问题。
首先连接的方法为
socket = new Socket();
SocketAddress socAdd = new InetSocketAddress("192.168.23.1", 30000);
socket.connect(socAdd, 5000); //2.3正常4.4出错
2.3下正常连接,而4.4崩溃,一直找不到原因,后来google推荐最好不要在主进程中就进行socket连接
故编写了线程
class MyThread extends Thread{
MyThread(){
super();
}
public void run(){
try{
socket = new Socket();
SocketAddress socAdd = new InetSocketAddress("192.168.23.1", 30000);
socket.connect(socAdd, 5000); //2.3正常4.4出错
os = socket.getOutputStream();
is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
os.write("android\n".getBytes()); //测试连接
os.flush();
/*bundle.putString("msg", buffer.toString());
msg.setData(bundle);
myHandler.sendMessage(msg);*/
}catch(SocketException se){
se.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}
}
}
当时使用的调用方法为
myThread = new MyThread();
myThread.run();
结果仍然报错,socket.connect()连接不能,却没有捕获到socketConnectException异常
错误为android.os.NetworkOnMainThreadException
原来是使用Thread的run和start有区别
run仍然只有一个线程,而start才是真正的多线程
改成调用start()
单步调试能够通过start()
却在接下来的一步os.write("start connected")出错。
错误为java.lang.NullPointerException
且发现start()并没有向服务器写入android测试字符串
原来start调用后,run()尚未运行完,而主进程已经进行到下一行os.write(),
故os尚未对某一实例进行引用,仍未空指针。
将thread的创建改在startButtonOnClick之前,能够正常连接