Autore Topic: Connessione Socket fra diverse Activity  (Letto 741 volte)

Offline vardar

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
Connessione Socket fra diverse Activity
« il: 10 Settembre 2013, 14:47:14 CEST »
0
Salve a tutti, scrivo per esporre un problema nel caso qualcuno mi possa aiutare: in un'applicazione android che ho scritto eseguo una connessione ad un server socket nella rete. La connessione funziona perfettamente e riesco ad inviare e ricevere dati dal server.
Tuttavia nel momento in cui cambio activity perdo la connessione socket. Esiste un modo per mantenere la connessione persistente fra activity diverse?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Connessione Socket fra diverse Activity
« Risposta #1 il: 11 Settembre 2013, 08:45:01 CEST »
0
Il modo probabilmente più corretto è gestire la connettività attraverso un service, al servizio delle varie activity.

Altrimenti un modo più grezzo di mantenerne la persistenza potrebbe essere estendere l'oggetto Application (che alla fine è un Singleton) e memorizzare il riferimento al socket in tale oggetto.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline vardar

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
Re:Connessione Socket fra diverse Activity
« Risposta #2 il: 11 Settembre 2013, 12:05:06 CEST »
0
Il modo probabilmente più corretto è gestire la connettività attraverso un service, al servizio delle varie activity.

Altrimenti un modo più grezzo di mantenerne la persistenza potrebbe essere estendere l'oggetto Application (che alla fine è un Singleton) e memorizzare il riferimento al socket in tale oggetto.

Infatti anche cercando in giro su internet veniva consigliato proprio di usare un servizio, solo che non riesco a crearlo e, anche una volta creato, non so come accedervi per inviare dati ed ottenere risposte. Tu riusciresti gentilmente a darmi qualche indicazione più nello specifico?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Connessione Socket fra diverse Activity
« Risposta #3 il: 11 Settembre 2013, 12:14:15 CEST »
0
Infatti anche cercando in giro su internet veniva consigliato proprio di usare un servizio, solo che non riesco a crearlo e, anche una volta creato, non so come accedervi per inviare dati ed ottenere risposte. Tu riusciresti gentilmente a darmi qualche indicazione più nello specifico?

Non è che sia possibile spiegarlo o mostrarlo in due righe.

Io partirei leggendo un po' di documentazione sulla struttura dei Service.
Services | Android Developers

E poi proverei un bel tutorial.
Android Service Tutorial
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline vardar

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
Re:Connessione Socket fra diverse Activity
« Risposta #4 il: 12 Settembre 2013, 17:14:52 CEST »
0
Sto provando a seguire un po' la guida di esempio, adesso vediamo cosa riesco a combinare.

Post unito: 13 Settembre 2013, 15:58:28 CEST
Credo di essere arrivato a buon punto, ma mi manca ancora un piccolo passaggio....

allora, tanto per cominciare nella mia activity eseguo il servizio, tra l'altro passandogli dei parametri che voglio:

Codice (Java): [Seleziona]
Intent intent = new Intent(context, SocketService.class);
        intent.putExtra("SERVER_IP", SERVER);
        context.startService(intent);

a questo punto viene eseguito il servizio:

Codice (Java): [Seleziona]
public class SocketService extends Service {
       
        @Override
        public IBinder onBind(Intent intent) {
              return mBinder;
        }
       
        private final IBinder mBinder = new LocalBinder();

        public class LocalBinder extends Binder {
        public SocketService getService() {
            return SocketService.this;
        }
    }
       
        @Override
          public void onCreate() {
                super.onCreate();
                Log.d(TAG, "Servizio creato");
        }
       
       public void sendMessage(String message){
        if (out != null && !out.checkError()) {
            out.println(message);
            out.flush();
        }
    }
       
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {

                super.onStartCommand(intent, flags, startId);
               
                Bundle bundle = intent.getExtras();
                SERVER_IP = bundle.getString("SERVER_IP");
               
                Log.d(TAG, "Servizio avviato");
               
                new Thread(new ClientThread()).start();
       
                return Service.START_STICKY;
        }
       
        public class ClientThread implements Runnable {
               
                @Override
                public void run() {
                       
                        try {
                               
                                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                                socket = new Socket(serverAddr, SERVERPORT);
                               
                                out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                               
                                out.println("login");
                                out.flush();
                               
                                Log.d(TAG, "==> login");
                               
                                line = in.readLine();
                                Log.d(TAG, "<== " + line);
                               
                        } catch (UnknownHostException e1) {
                                e1.printStackTrace();
                        } catch (IOException e1) {
                                e1.printStackTrace();
                        } catch (Exception e1) {
                                e1.printStackTrace();
                        }
                       
                }
        }
       
        @Override
          public void onDestroy() {
                super.onDestroy();
        try {
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        socket = null;
        }
}

Il servizio parte correttamente ed effettua la connessione al socket. Ora, però, avrei bisogno che l'activity che ha fatto partire il servizio (ma poi anche successive activity che verranno aperte) ricevano le risposte che il server invierà attraverso quel servizio. Ad, sempio, tanto per cominciare, mi servirebbe che l'ativity ricevesse il contenuto della stringa "line = in.readLine();" e questo è proprio il pezzo che mi manca. Non riesco a capire come far ricevere il dato all'activity. E la stringa "line" contiene qualcosa, perchè nel log "Log.d(TAG, "<== " + line);" io ottengo il contenuto (che poi non è altroc he la risposta del mio server), solo che se non riesco a passarlo all'activity non riesco ad andare avanti.
« Ultima modifica: 13 Settembre 2013, 16:00:36 CEST da vardar »