Autore Topic: Layout chat di prova con socket  (Letto 1544 volte)

Offline mastergap

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    HTC Legend
  • Sistema operativo:
    Linux
Layout chat di prova con socket
« il: 01 Settembre 2010, 11:37:21 CEST »
0
Ciao, ho scritto una semplice applicazione client-server di prova per fare comunicare il pc (server) e android (client) tramite un socket. L'applicazione in pratica è una specie di chat minimalistica dove pc e telefono possono mandarsi messaggi a vicenda. Nel layout ho un EditText, una TextView e un Button. La cosa curiosa è che l'applicazione funziona correttamente ma l'interfaccia non viene visualizzata sul telefono, infatti il pc dice che la connessione è avvenuta e se mando dei messaggi dal pc al telefono tutto viene fatto correttamente, l'interfaccia compare solo quando chiudo brutalmente l'applicazione server sul pc, viene catturata una EOFEsception su android e a quel punto compare l'interfaccia con tutti i relativi messaggi ricevuti, mentre durante la connessione lo schermo è tutto nero e c'è solo il titolo dell'app. Qualcuno ha idea di come risolvere questo problema e del perchè avvenga? Grazie mille!

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Layout chat di prova con socket
« Risposta #1 il: 01 Settembre 2010, 11:44:59 CEST »
0
Difficile risponderti senza vedere nemmeno una riga di codice... provo ad attivare la sfera di cristallo!  o_O

Quello che mi viene da pensare è che sul cellulare, in qualche modo, devi metterti in ascolto su una porta (probabilmente tramite una ServerSocket.accept()):. Me questa blocca l'esecuzione del codice, che fermandosi non fa andare avanti il thread della UI per la corretta visualizzazione dell'interfaccia.

Quindi... sicuro che non blocchi l'esecuzione del thread grafico? Ti metti in ascolto in un thread a parte?

Offline mastergap

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    HTC Legend
  • Sistema operativo:
    Linux
Re:Layout chat di prova con socket
« Risposta #2 il: 01 Settembre 2010, 12:02:28 CEST »
0
No, faccio tutto in una activity senza aspettare thread a parte, a meno che questo non venga fatto di default utilizzando i socket...
Questo è il codice:
Codice (Java): [Seleziona]
package com.android.examples.androidclientprova;

import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class AndroidClientProva extends Activity {

       private EditText enter;
       private TextView display;
       ObjectOutputStream output;
       ObjectInputStream input;

       String message = "";

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       Button send = (Button) findViewById(R.id.send);
       enter = (EditText) findViewById(R.id.enter);
       display = (TextView) findViewById(R.id.display);
       display.setMovementMethod(ScrollingMovementMethod.getInstance());

       send.setOnClickListener(new View.OnClickListener() {

                   public void onClick(View view) {
                       sendData(enter.getText().toString());
                   }
               });

       runClient();
   }

   public void runClient(){
               Socket client;

               try{

                       display.setText("Attempting connection\n");

                       client = new Socket(InetAddress.getByName("157.27.243.212"), 5000);

                       display.append("connect to: "+client.getInetAddress().getHostName());

                       output = new ObjectOutputStream(client.getOutputStream());
                       output.flush();

                       input = new ObjectInputStream(client.getInputStream());

                       display.append("\n Got I/O Streams\n");

                       enter.setEnabled(true);

                       do{
                               try{
                                       message = (String) input.readObject();

                                       display.append("\n"+message);
                                       //display.setCaretPosition(display.getText().length());
                               }
                               catch(ClassNotFoundException e){
                                       display.append("\nUnknown Object Type Received");
                               }
                       }
                       while (!message.equals("SERVER>>> TERMINATE"));

                       display.append("\nClosing Connection\n");

                       input.close();
                       output.close();
                       client.close();
               }

               catch(EOFException eof){
                       display.append("\nEOFException lanciata\n");
                       //System.out.println("Server Terminated Connection");
               }
               catch(IOException io){
                       display.append("\nIOException lanciata\n");
                       //io.printStackTrace();
               }
       }

   private void sendData(String s){

               try{
                       message = s;
                       output.writeObject("CLIENT>>> "+s);
                       output.flush();

                       display.append("\nCLIENT>>> "+s);
               }
               catch(IOException io){
                       display.append("\nError Writing Object");
               }
       }
}
« Ultima modifica: 01 Settembre 2010, 12:31:58 CEST da JD, Reason: Usate i bbcode java e xml!! xD »

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:Layout chat di prova con socket
« Risposta #3 il: 01 Settembre 2010, 12:15:20 CEST »
0
Come dice MarcoDuff, tutte le elaborazioni e comunicazioni di durata rilevante devono essere eseguite in un thread diverso da quello della UI. E' proprio il modello delle applicazioni Android che è fatto così.

Penso tu possa facilmente riadattare questo tutorial [facile] HttpBookSearch: AsyncTask, HttpClient, XML parsing, ProgressDialog - Android Developers Italia alle tue esigenze.

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store