xztau
@xztau
Я

Как в android работать с socket'ом?

Пытаюсь наладить связь между ПК и телефоном с помощью сокетов.
Разрешил соединения в интернет
<uses-permission android:name="android.permission.INTERNET" />

Соединение делаю в отдельном потоке, который создаю в главной активности по щелчку на кнопке.
Кстати, чем Runnable отличается от AsincTask?
final Handler handler = new Handler();
        handler.post(new Runnable() {
            Socket inSock = null;
            @Override
            public void run() {
                Socket sock = null;
                try{
                    sock = new Socket("192.168.1.2", 4444);
                }
                catch (Exception ex){
                    Log.v("Socket create", "Unable to create");
                    ex.printStackTrace();
                }
            }
        });

Подключения не происходит (слушаю sudo nc -l 4444)
Пишет:
spoiler
07-25 12:09:10.425 1997-1997/study.sockettest V/Socket create: Unable to create
07-25 12:09:10.425 1997-1997/study.sockettest W/System.err: android.os.NetworkOnMainThreadException
07-25 12:09:10.425 1997-1997/study.sockettest W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1186)
07-25 12:09:10.425 1997-1997/study.sockettest W/System.err:     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
07-25 12:09:10.435 1997-1997/study.sockettest W/System.err:     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
07-25 12:09:10.435 1997-1997/study.sockettest W/System.err:     at libcore.io.IoBridge.connect(IoBridge.java:112)
07-25 12:09:10.435 1997-1997/study.sockettest W/System.err:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
07-25 12:09:10.435 1997-1997/study.sockettest W/System.err:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
07-25 12:09:10.435 1997-1997/study.sockettest W/System.err:     at java.net.Socket.startupSocket(Socket.java:596)
07-25 12:09:10.435 1997-1997/study.sockettest W/System.err:     at java.net.Socket.tryAllAddresses(Socket.java:127)
07-25 12:09:10.435 1997-1997/study.sockettest W/System.err:     at java.net.Socket.<init>(Socket.java:177)
07-25 12:09:10.435 1997-1997/study.sockettest W/System.err:     at java.net.Socket.<init>(Socket.java:149)
07-25 12:09:10.435 1997-1997/study.sockettest W/System.err:     at study.sockettest.MainActivity$2.run(MainActivity.java:80)
07-25 12:09:10.435 1997-1997/study.sockettest W/System.err:     at android.os.Handler.handleCallback(Handler.java:608)
07-25 12:09:10.446 1997-1997/study.sockettest W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:92)
07-25 12:09:10.446 1997-1997/study.sockettest W/System.err:     at android.os.Looper.loop(Looper.java:156)
07-25 12:09:10.446 1997-1997/study.sockettest W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:4987)
07-25 12:09:10.446 1997-1997/study.sockettest W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
07-25 12:09:10.446 1997-1997/study.sockettest W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
07-25 12:09:10.446 1997-1997/study.sockettest W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-25 12:09:10.446 1997-1997/study.sockettest W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-25 12:09:10.446 1997-1997/study.sockettest W/System.err:     at dalvik.system.NativeStart.main(Native Method)

Правильно ли я понимаю, что он жалуется на android.os.NetworkOnMainThreadException?
Но я и так вроде бы отдельный поток создал.
  • Вопрос задан
  • 312 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Ты не создал поток. Handler.post откладывает выполнение Runnable на следующий фрейм просто. Дело происходит на том же самом потоке.

Кстати, чем Runnable отличается от AsincTask?

Отличный вопрос, и очень жаль, что ты не разобрал его сам. Runnable это просто функциональный интерфейс (интерфейс с одним методом run).
AsyncTask это более сложная штука, которая как раз и выполняется на другом потоке.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Jeckit
@Jeckit
AsyncTask выполняется в другом потоке, или как говорится в Background'е.
А Runnable этого всего лишь, можно сказать, один метод run, который выполняется в основном потоке.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы