Autore Topic: Arresto anomalo app udp  (Letto 420 volte)

Offline davidedz

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 8.1
Arresto anomalo app udp
« il: 28 Aprile 2015, 23:45:00 CEST »
0
Ciao a tutti sono nuovo del forum e della programmazione android. mi sto cimentando nella realizzazione di un'app che mi consenta di inviare un messaggio tramite udp, che mi servirà in seguito per il controllo di arduino.

Ho cercato un su internet vari tutorial per la sua realizzazione ma ora mi sono bloccato in un problema che non riesco a risolvere, l'app quando premo il punsante invia per l'invio del messaggio si arresta. Vi posto il codice:
Codice (Java): [Seleziona]
public class MainActivity extends ActionBarActivity {

    private Socket client;
    private PrintWriter printWriter;
    private EditText message;
    private Button invia;
    private String msg, ip, portStr;
    private int port = 0;
    int msgLength=0;
    byte[] messageByte;
    DatagramSocket dataSock;
    DatagramPacket pack;
    InetAddress local;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar =(Toolbar) findViewById(R.id.tool_bar);
        setSupportActionBar(toolbar);

        invia = (Button) findViewById(R.id.invia);
        message = (EditText) findViewById(R.id.message);
        TextView clientInfo = (TextView) findViewById(R.id.clientInfo);

        Bundle extras = getIntent().getExtras();
        if(extras == null){
            clientInfo.setText("null");
        }
        else{
            ip = extras.getString("stringIp");
            portStr = extras.getString("stringPort");
            clientInfo.setText(ip+portStr);
            port = Integer.parseInt(portStr);
        }



        invia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    dataSock = new DatagramSocket();
                    local = InetAddress.getByName(ip);
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }

                msg = message.getText().toString();
                msgLength = msg.length();
                messageByte = msg.getBytes();

                pack = new DatagramPacket(messageByte, msgLength, local, port);

                try {
                    dataSock.send(pack);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.bttSettings) {
            Intent openSettings = new Intent(this, settings.class);
            startActivity(openSettings);
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent loadhome) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            return true;
        }
        return super.onKeyDown(keyCode, loadhome);
    }
}

Facendo il debug mi restituisce questo errori:

04-28 23:39:24.365  29375-29375/com.example.davide.udpapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.davide.udpapp, PID: 29375
    android.os.NetworkOnMainThreadException
            at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
            at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:276)
            at libcore.io.IoBridge.sendto(IoBridge.java:513)
            at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:184)
            at java.net.DatagramSocket.send(DatagramSocket.java:305)
            at com.example.davide.udpapp.MainActivity$1.onClick(MainActivity.java:82)
            at android.view.View.performClick(View.java:4780)
            at android.view.View$PerformClick.run(View.java:19866)
            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.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Sapete dirmi dove sbaglio?
Grazie mille!
« Ultima modifica: 29 Aprile 2015, 10:16:35 CEST da davidedz »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1224
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Arresto anomalo app udp
« Risposta #1 il: 28 Aprile 2015, 23:58:23 CEST »
0
Guardando velocemente forse stai facendo qualche operazione che non puoi fare nel main thread. Dovresti usare un thread o asynktask

Offline davidedz

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 8.1
Re:Arresto anomalo app udp
« Risposta #2 il: 29 Aprile 2015, 10:14:11 CEST »
0
Grazie mille! Era proprio quello il problema!
Se a qualcuno devesse servire ho cambiato il codice così:
Codice (Java): [Seleziona]
package com.example.davide.udpapp;


import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.content.Intent;
import android.widget.EditText;
import android.widget.TextView;
import android.support.v7.widget.Toolbar;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

public class MainActivity extends ActionBarActivity {

    private Socket client;
    private PrintWriter printWriter;
    private EditText message;
    private Button invia;
    private String msg, ip, portStr;
    private int port = 0;
    int msgLength=0;
    byte[] messageByte;
    DatagramSocket dataSock;
    DatagramPacket pack;
    InetAddress local;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar =(Toolbar) findViewById(R.id.tool_bar);
        setSupportActionBar(toolbar);

        invia = (Button) findViewById(R.id.invia);
        message = (EditText) findViewById(R.id.message);
        TextView clientInfo = (TextView) findViewById(R.id.clientInfo);

        Bundle extras = getIntent().getExtras();
        if(extras == null){
            clientInfo.setText("null");
        }
        else{
            ip = extras.getString("stringIp");
            portStr = extras.getString("stringPort");
            clientInfo.setText(ip+portStr);
            port = Integer.parseInt(portStr);
        }



        invia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            dataSock = new DatagramSocket();
                            local = InetAddress.getByName(ip);
                        } catch (SocketException e) {
                            e.printStackTrace();
                        } catch (UnknownHostException e) {
                            e.printStackTrace();
                        }

                        msg = message.getText().toString();
                        msgLength = msg.length();
                        messageByte = msg.getBytes();

                        pack = new DatagramPacket(messageByte, msgLength, local, port);

                        try {
                            dataSock.send(pack);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();

            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.bttSettings) {
            Intent openSettings = new Intent(this, settings.class);
            startActivity(openSettings);
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent loadhome) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            return true;
        }
        return super.onKeyDown(keyCode, loadhome);
    }
}