Привет. есть задача: нужно открыть сокет и периодически читать/писать в него сообщения.
Мой взгляд на проблему: нужен поток, в методе Thread#run() которого я открываю сокет и забираю из него InputStream и OutputStream.
gist
И все работает славно (на эмуляторе). Но, поскольку, я вызываю метод
#sendBytes(byte[]) фактически из MainThread'a, то появилась необходимость перелопатить всё это.
Перелопатить решил с помощью HandlerThread'a:
gist
Что изменилось: добавил HandlerThread и теперь все задачи выполняю через него: в
#onLooperPrepared инициализирую Handler для текущего Looper'a, кидают туда таск-инициализатор (то же, что было в первом варианте в методе run, но без бесконечного цикла), и потом кидаю таск
#tryRead(), который после выполнения кидает сам себя. Запись в сокет происходит тем же образом: кидается таск, который пишет байты в OutputStream.
НО в итоге вот:
E/SocketThread: java.net.SocketException: sendto failed: EBADF (Bad file number)
at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:546)
at libcore.io.IoBridge.sendto(IoBridge.java:515)
at java.net.PlainSocketImpl.write(PlainSocketImpl.java:504)
at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:37)
at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:266)
at java.io.OutputStream.write(OutputStream.java:82)
at com.example.networking.socket.SocketThread.trySend(SocketThread.java:82)
at com.example.networking.socket.SocketThread.lambda$sendBytes$0(SocketThread.java:72)
at com.example.networking.socket.SocketThread$$Lambda$4.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.os.HandlerThread.run(HandlerThread.java:61)
Caused by: android.system.ErrnoException: sendto failed: EBADF (Bad file number)
at libcore.io.Posix.sendtoBytes(Native Method)
at libcore.io.Posix.sendto(Posix.java:206)
at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:278)
at libcore.io.IoBridge.sendto(IoBridge.java:513)
at java.net.PlainSocketImpl.write(PlainSocketImpl.java:504)
at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:37)
at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:266)
at java.io.OutputStream.write(OutputStream.java:82)
at com.example.networking.socket.SocketThread.trySend(SocketThread.java:82)
at com.example.socket.SocketThread.lambda$sendBytes$0(SocketThread.java:72)
at com.example.networking.socket.SocketThread$$Lambda$4.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.os.HandlerThread.run(HandlerThread.java:61)
в чем может быть ошибка?
PS. а как узнать, что сокет отключился?