Autore Topic: getOutputStream() su un oggetto NULL?  (Letto 556 volte)

Offline Void

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G4
  • Sistema operativo:
    Windows 7
getOutputStream() su un oggetto NULL?
« il: 11 Giugno 2017, 16:42:23 CEST »
0
Salve a tutti, mi sono iscritto da poco (e spero di non aver sbagliato sezione) in quanto mi sono ritrovato di fronte un problema.
Nel codice in allegato, vorrei istanziare un nuovo Thread, ma nel momento in cui vado a lavorare sul Socket mi stampa il seguente errore:

Citazione
java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.OutputStream java.net.Socket.getOutputStream()' on a null object reference

Ora, ho capito che è perché sta richiamando il metodo su un oggetto NULL, ma non riesco a capire come "ovviare" a questo problema! Vi allego qui sotto il codice:
Codice (Java): [Seleziona]
public class Conferma extends AppCompatActivity {

    private final String TAG = "Conferma";
    private Socket socket;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.conferma);

        final EditText etTavolo = (EditText) findViewById(R.id.etTavolo);
        final RadioButton rbSi = (RadioButton) findViewById(R.id.rbSi);
        RadioButton rbNo = (RadioButton) findViewById(R.id.rbNo);
        Button bInvia = (Button) findViewById(R.id.bInvia);

        bInvia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String ordine = getIntent().getExtras().getString("ordine");
                if(etTavolo.getText().toString().equals("")){
                    AlertDialog.Builder builder = new AlertDialog.Builder(Conferma.this);
                    builder.setMessage("Inserire il numero del tavolo!").setNegativeButton("Riprova!", null).create().show();
                }
                ordine = ordine + "Tavolo: " + etTavolo.getText().toString() + "/";
                if(rbSi.isChecked()) {
                    ordine = ordine + "Coperto: Sì/";
                }
                else{
                    ordine = ordine + "Coperto: No/";
                }
                Log.d(TAG, ordine);

                //invio informazione
                new Thread(new ClientThread()).start();
                inviaStringa(view, ordine);
            }
        });
    }

    private void inviaStringa(View view, String ordine) {
        try{
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            out.println(ordine);
        }catch (Exception e) {
            Log.e(TAG, "Errore: " + e);
        }
    }

    private class ClientThread implements Runnable {

        private static final int SERVER_PORT = 6000;
        private static final String SERVER_IP = "109.115.84.90";
        private static final String TAG = "ClientThread";

        @Override
        public void run() {
            try {
                InetAddress serverAddress = InetAddress.getByName(SERVER_IP);
                socket = new Socket(serverAddress, SERVER_PORT);
            } catch (UnknownHostException e) {
                Log.e(TAG, "Errore: " + e);
            } catch (IOException e) {
                Log.e(TAG, "Errore: " + e);
            }
        }
    }
}

Grazie a chiunque mi aiuterà! :3

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 804
  • Respect: +168
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:getOutputStream() su un oggetto NULL?
« Risposta #1 il: 13 Giugno 2017, 11:00:21 CEST »
0
Apri un soket da un thread ma lo usi dal main thread, per altro prima ancora che venga aperto.

Passa i riferimenti di view e ordine al runnable e chiama inviaStringa subito dopo aver aperto la soket:

Codice (Java): [Seleziona]
public class Conferma extends AppCompatActivity {

        private final String TAG = "Conferma";
        private Socket socket;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.conferma);

                final EditText etTavolo = (EditText) findViewById(R.id.etTavolo);
                final RadioButton rbSi = (RadioButton) findViewById(R.id.rbSi);
                RadioButton rbNo = (RadioButton) findViewById(R.id.rbNo);
                Button bInvia = (Button) findViewById(R.id.bInvia);

                bInvia.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                                String ordine = getIntent().getExtras().getString("ordine");
                                if(etTavolo.getText().toString().equals("")){
                                        AlertDialog.Builder builder = new AlertDialog.Builder(Conferma.this);
                                        builder.setMessage("Inserire il numero del tavolo!").setNegativeButton("Riprova!", null).create().show();
                                }
                                ordine = ordine + "Tavolo: " + etTavolo.getText().toString() + "/";
                                if(rbSi.isChecked()) {
                                        ordine = ordine + "Coperto: Sì/";
                                }
                                else{
                                        ordine = ordine + "Coperto: No/";
                                }
                                Log.d(TAG, ordine);

                                //invio informazione
                                //new Thread(new ClientThread()).start(); //Rimosso
                                //inviaStringa(view, ordine); //Rimosso
                                ClientThread ct = new ClientThread(); //Aggiunto
                                ct.setOrdine(ordine); //Aggiunto
                                ct.setView(view); //Aggiunto
                                new Thread(ct).start(); //Aggiunto
                        }
                });
        }

        private void inviaStringa(View view, String ordine) {
                try{
                        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                        out.println(ordine);
                }catch (Exception e) {
                        Log.e(TAG, "Errore: " + e);
                }
        }

        private class ClientThread implements Runnable {

                private static final int SERVER_PORT = 6000;
                private static final String SERVER_IP = "109.115.84.90";
                private static final String TAG = "ClientThread";
                private String mOrdine = null; //Aggiunto
                private View mView = null; //Aggiunto
               
                public void setOrdine(String ordine) { //Aggiunto
                        mOrdine = ordine;
                }
               
                public void setView(View view) { //Aggiunto
                        mView = view;
                }

                @Override
                public void run() {
                        if (mView == null || mOrdine == null) //Aggiunto
                                throw new IllegalStateException("Definire ordine con setOrdine e view con setView");
                        try {
                                InetAddress serverAddress = InetAddress.getByName(SERVER_IP);
                                socket = new Socket(serverAddress, SERVER_PORT);
                                inviaStringa(mView, mOrdine); //Aggiunto
                        } catch (UnknownHostException e) {
                                Log.e(TAG, "Errore: " + e);
                        } catch (IOException e) {
                                Log.e(TAG, "Errore: " + e);
                        }
                }
        }
}

Ti consiglio comunque di usare AsyncTask per questo tipo di operazioni asincrone.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.