Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2017
    Messaggi
    4

    [ANDROID] Problematiche sull'applicazione di AsynchTask

    Salve a tutti, sono nuovo e mi sono iscritto per poter chiedere alcuni pareri e/o consigli circa l'applicazione che sto sviluppando in questo momento.
    Vi spiego in breve di cosa si tratta: l'applicazione client, che sta su un dispositivo mobile Android permette all'utente di inserire delle ordinazioni (che possono essere di antipasti, primi, secondi, ecc), le quali verranno poi fatte stare in una Stringa (concatenata con il carattere '/') e inviata ad un server (un altro dispositivo Android), il quale dividerà la Stringa e la stamperà nella sua interfaccia.
    Ora, inizialmente avevo pensato di approcciarmi al problema utilizzando Thread e Socket, ma da quanto ho letto in rete pare che dalla versione 4.0 in su di Android non sia più possibile.
    Mi sono dunque buttato sulle AsynchTask, che mi stanno dando non pochi problemi. Al momento sono arrivato al codice postato a fine messaggio, il quale presenta questi errori sulla logcat:

    W/System.err: at com.tabian.client.Conferma$MyTask.doInBackground(C onferma.java:74)
    W/System.err: at com.tabian.client.Conferma$MyTask.doInBackground(C onferma.java:59)
    Le 2 righe coinvolte sono, in ordine:

    socket = new Socket(serverAddress, SERVER_PORT);
    private class MyTask extends AsyncTask<String, Void, String>{
    È tutto il pomeriggio che cerco su Internet soluzioni e/o cambio cose, ma non ne vengo a capo!
    Grazie in anticipo per l'aiuto, e perdonatemi se magari sono stato troppo "lungo" in fase di introduzione, ma spero si sia capito il problema!

    CODICE:
    codice:
    public class Conferma extends AppCompatActivity {
    
        private static final int SERVER_PORT = 6000;
        private static final String SERVER_IP = "109.115.84.90";
        private static 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);
            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);
    
                    new MyTask().execute(ordine);
                }
            });
        }
    
        private class MyTask extends AsyncTask<String, Void, String>{
    
            @Override
    protected String doInBackground(String... params) {
                String ordine = params[0];
                Log.d(TAG, ordine);
    
                InetAddress serverAddress = null;
                try {
                    serverAddress = InetAddress.getByName(SERVER_IP);
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
                Log.d(TAG, "creato");
                try {
                    socket = new Socket(serverAddress, SERVER_PORT);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                inviaStringa(ordine, socket);
    
                return "Executed";
            }
    
    
        }
    
        private void inviaStringa(String ordine, Socket socket) {
            try {
                OutputStream s = socket.getOutputStream();
                Log.d(TAG, "ok1");
                OutputStreamWriter outputStreamWriter = new OutputStreamWriter(s);
                Log.d(TAG, "ok2");
                BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
                Log.d(TAG, "ok3");
                PrintWriter out = new PrintWriter(bufferedWriter, true);
                Log.d(TAG, "ok4");
                out.println(ordine);
            } catch (Exception e) {
                Log.e(TAG, "Errore0000: " + e);
            }
        }
    
    }

  2. #2
    ciao!

    non mi convince molto quel AsyncTask<String, Void, String>.
    prova a metterlo così AsyncTask<String, Void, Void> (in fin dei conti gli passi un solo oggetto String).

    cmq, oltre a questo che non so quanto sia risolutivo, posta un pò più di log.
    da quelle due righe si capisce poco!

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    C'è una cosa importante da far notare: il Socket NON viene chiuso e inoltre la variabile che tiene il riferimento al Socket è a livello di istanza di Conferma. Questo vuol dire che anche dopo la terminazione di doInBackground il Socket resta referenziato e "vivo".
    Queste sono questioni di "design" che vanno affrontate meglio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2017
    Messaggi
    4
    Quote Originariamente inviata da fermat Visualizza il messaggio
    ciao!

    non mi convince molto quel AsyncTask<String, Void, String>.
    prova a metterlo così AsyncTask<String, Void, Void> (in fin dei conti gli passi un solo oggetto String).

    cmq, oltre a questo che non so quanto sia risolutivo, posta un pò più di log.
    da quelle due righe si capisce poco!
    L'ho fatto <String, Void, String> perché ritorna la "Executed", ma posso benissimo farne a meno e piazzarci un bel Void e return null effettivamente.

    Per quanto riguarda il log, dopo aver cambiato quella cosa sull'AsyncTask, mi ha fatto vedere ulteriori cose: innanzitutto, ho provato a mettere all'interno del try/catch in cui inizializzo il socket 2 Log: uno mi stampa la stringa "corretto" e l'altro la stringa "eccezione" in base a dove è andato. Inoltre, ho aggiunto un ulteriore stampa di una stringa nel caso il socket sia = null. A livello di codice, ho fatto una cosa del genere:

    codice:
    protected Void doInBackground(String... params) {
            Socket socket = null;
            String ordine = params[0];
    
            Log.d(TAG, ordine);
    
            InetAddress serverAddress = null;
            try {
                serverAddress = InetAddress.getByName(SERVER_IP);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
    
            try {
                Log.d(TAG, "corretto");
                socket = new Socket(serverAddress, 6000);
            } catch (IOException e) {
                Log.d(TAG, "eccezione");
                e.printStackTrace();
            }
    
            Log.d(TAG, "creato");
    
            try {
                if(socket != null){
                OutputStreamWriter outputStreamWriter = new OutputStreamWriter(socket.getOutputStream());
                BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
                PrintWriter out = new PrintWriter(bufferedWriter, true);
                out.println(ordine);
                }
                else{
                    Log.d(TAG, "socket null");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    }
    Nel log è comparso, subito dopo la stringa "eccezione", l'eccezione java.net.ConnectException. Deduco dunque non sia avvenuta la connessione al server, il che mi fa pensare che abbia sbagliato a dare l'indirizzo del server.

    Dunque, io per collegare l'app client (che risiede su uno smartphone) e l'app server(su un altro smartphone) li ho connessi entrambi alla stessa rete Wi-Fi, sono andato sulle impostazione dello smartphone in cui risiede l'applicazione lato server e ho utilizzato l'indirizzo IP che mi dava in
    Wi-Fi -> Avanzate Wi-Fi. È corretto oppure c'è qualcosa di sbagliato?
    Grazie della pazienza!

    Per quanto riguarda l'organizzazione del programma sì, hai completamente ragione andbin e provvederò a sistemare anche quell'aspetto!

  5. #5
    ti stampa corretto perchè cmq nel try ci entri.
    se quel Log.d(TAG, "corretto"); lo metti dopo socket = new Socket(serverAddress, 6000);, non dovrebbe stamparlo.

    però, cosi come dici, potrebbe essere un problema della parte server.
    sinceramente non ho mai fatto un server socket su un dispositivo android.
    se provi ad usare un port scanner sul dispositivo server, vedi la porta aperta?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2017
    Messaggi
    4
    Non sono molto ferrato su queste cose, per port scanning cosa intendi?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Voido Visualizza il messaggio
    per port scanning cosa intendi?
    Un software (ne esistono sicuramente diversi) che dato un indirizzo IP (o range di IP) va a scansionare tutte le porte per dirti quelle che sono "aperte".
    Queste permette di fare una prima verifica per vedere se un "server" ha delle porte aperte e quali.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  8. #8
    tanto per citarne uno, nmap.
    quando lo installi, dovrebbe installarti anche un GUI.

    cmq:
    codice:
    nmap 192.168.1.1/24
    dando per scontato che usi come classe di indirizzi 192.168.1.*.
    mettici la tua nel caso fosse diversa.

    come ti ha già detto andbin, cosi almeno verifichiamo che la porta del server sia aperta e ragguingibile.
    potrebbe essere banalmente quello il problema.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2017
    Messaggi
    4
    Ok allora signori, ho trovato il problema: ip sbagliato.
    Ora funge tutto, devo solo trovare come aggiungere elementi alla ListView nel server man mano che riceve nuove stringhe, ed è finito! Grazie dell'aiuto, siete stati molto gentili! ^^

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.