1. 程式人生 > >安卓6.0以後,socket連線失敗的原因

安卓6.0以後,socket連線失敗的原因

老早以前的專案要適配安卓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,但是實際並不一定連線成功,可能正在努力連線。