Connessione UDP

di il
4 risposte

Connessione UDP

Buon giorno, sto scrivendo una app android per la gestione della domotica KNX.
Quando tento di scrivere o leggere dati utilizzando la connessione udp l'app va in crash.
Ho cercato su intenet possibili motivi ma dappertutto trovo sempre lo stesso codice per la connessione, trasmissione e ricezione di dati via udp socket il codice che uso è questo:

DatagramSocket client_socket = new DatagramSocket(port);
DatagramPacket send_packet = new DatagramPacket(buf_send,len, ip, port);
client_socket.send(send_packet);

l'errore che genera il crash è questo:

11-26 11:02:06.284 30365-30365/com.example.bagigio.lyra E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.bagigio.lyra, PID: 30365
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bagigio.lyra/com.example.bagigio.lyra.MainActivity}: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2702)
at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:2767)
at android.app.ActivityThread.access$900(ActivityThre ad.java:177)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1449)
at android.os.Handler.dispatchMessage(Handler.java:10 2)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.jav a:5951)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:1400)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:1195)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNe twork(StrictMode.java:1147)
at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:2 76)
at libcore.io.IoBridge.sendto(IoBridge.java:513)
at java.net.PlainDatagramSocketImpl.send(PlainDatagra mSocketImpl.java:184)
at java.net.DatagramSocket.send(DatagramSocket.java:3 05)
at com.example.bagigio.lyra.MainActivity$KNX_com.send _telegram(MainActivity.java:259)
at com.example.bagigio.lyra.MainActivity$KNX_com.conn ect(MainActivity.java:116)
at com.example.bagigio.lyra.MainActivity$KNX.<init>(M ainActivity.java:485)
at com.example.bagigio.lyra.MainActivity.onCreate(Mai nActivity.java:25)
at android.app.Activity.performCreate(Activity.java:6 289)
at android.app.Instrumentation.callActivityOnCreate(I nstrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2655)
at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:2767)
at android.app.ActivityThread.access$900(ActivityThre ad.java:177)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1449)
at android.os.Handler.dispatchMessage(Handler.java:10 2)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.jav a:5951)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:1400)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:1195)

Qualcuno ha qualche suggerimento in merito?

4 Risposte

  • Re: Connessione UDP

    bagigio82 ha scritto:


    11-26 11:02:06.284 30365-30365/com.example.bagigio.lyra E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.bagigio.lyra, PID: 30365
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bagigio.lyra/com.example.bagigio.lyra.MainActivity}: android.os.NetworkOnMainThreadException
    Non me ne intendo di Android (purtroppo) ma il problema è sicuramente legato all'uso dei thread in modo specifico rispetto a cosa è lecito fare in certi thread specifici della piattaforma.

    Ho trovato al volo questo post che mi sembra pertinente:
  • Re: Connessione UDP

    Ciao, il problema è quello descritto correttamente (come sempre!) da andbin.

    In Android così come in tanti altri ambienti, tutte le operazioni vengono eseguite su un unico thread, salvo andare a crearne manualmente di nuovi. Dato che le operazioni di rete sono tendenzialmente molto lente, il rischio è quello di bloccare questo thread, con la conseguenza che l'applicazione sembra essere bloccata (cioè non risponde agli input) finché quest'operazione non termina. Da Android 3.0 in poi, quindi, si è forzato l'utilizzo di un thread differente per queste operazioni di rete. Tuttavia Android ha semplificato un po' la vita agli sviluppatori introducendo nuove API apposite, come ad esempio la classe AsyncTask
  • Re: Connessione UDP

    Penso che il problema possa essere proprio quello. Ho provato a fare la stessa cosa nella stessa funzione e non mi restituisce errori.
  • Re: Connessione UDP

    bagigio82 ha scritto:


    Penso che il problema possa essere proprio quello. Ho provato a fare la stessa cosa nella stessa funzione e non mi restituisce errori.
    Il networking è potenzialmente lento/lungo, quindi se la piattaforma usa il paradigma del "single UI thread" (Swing, Android e altri), il networking NON va sicuramente di certo fatto nel UI thread. Andrebbe fatto in un thread di background .... con tutto quello che comporta.
Devi accedere o registrarti per scrivere nel forum
4 risposte