安卓6.0以後,socket連線失敗的原因
阿新 • • 發佈:2019-01-01
老早以前的專案要適配安卓7.0的平板電腦
-
信心滿滿的以為無縫適配,結果使用nio的socketchannel連線tcpserver時,一直連線失敗,而同樣的程式在5.0的安卓平板上就秒連,納悶了,開始無頭蒼蠅似的亂撞,直接用socket也失敗。
後來看到一個前輩的socket連線程式碼,connect之前呼叫了Thread.sleep方法睡了1000ms
抱著試一試的心態,在connect之前和之後各加了一行Thread.sleep(1000)居然成功了,
//socket連線
socketChannel = SocketChannel.open();
isa = new InetSocketAddress(ip, port);
Thread.sleep(1000);
socketChannel.connect(isa);
Thread.sleep(1000);
socketChannel.socket().setReceiveBufferSize(128);
socketChannel.configureBlocking(false);
if (socketChannel.isConnected()) {
UIUtils.showToastSafe("裝置連線成功");
isConnected =true;
}
while(isConnected){
//do something
ByteBuffer buf = ByteBuffer.allocate (128);
if((socketChannel.read(buf))>0) {
updateReceivedData(buf.array(),innerHandler);
buf.flip();
}
}
總結
socketChannel.isConnected()返回的結果雖然是true,但是實際並不一定連線成功,可能正在努力連線。