Question

J'ai créé une application multithread, mais elle reste bloquée si le serveur est indisponible.

Dans l'activité principale, j'ai créé les méthodes suivantes:

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

    //bind GUI elements
    ...

    //start TCPConnection Service in a new thread
    establishTCPConnection();
    ...

}


private void establishTCPConnection(){
    TCPClientServiceThread = new Thread(null, backgroundConnection, "connection");
    TCPClientServiceThread.start();
}

..


private Runnable backgroundConnection = new Runnable(){
    public void run(){
        //establish TCP connection
        doEstablishTCPConnection();
    }
};

private void doEstablishTCPConnection()
{
    //start TCPConnection service
    startService(new Intent(this, TCPClientService.class));
}

Et voici la classe TCPClientService:

public class TCPClientService extends Service{

...

private String serverAddress = "192.168.1.5";
private int portNumber = 1000;



@Override
public void onCreate()
{
    //TODO: Actions to perform when service is created
    connectionAvailable = false;

    IntentFilter dataReceiverFilter;
    dataReceiverFilter = new IntentFilter(MotranetClient.MOTION_DATA_UPDATED);
    dataReceiver = new DataReceiver();
    registerReceiver(dataReceiver, dataReceiverFilter);

    EstablishConnection();
}

@Override
public IBinder onBind(Intent intent)
{
    //TODO: Replace with service binding implementation
    return null;
}

private void EstablishConnection()
{
    try {
           InetAddress serverAddr = InetAddress.getByName(serverAddress);
           Log.d("TCP", "C: Connecting...");
           Socket socket = new Socket(serverAddr, portNumber);
           String message = "testing connection";

               try {
                Log.d("TCP", "C: Sending: '" + message + "'");
                PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
                out.println(message);
                Log.d("TCP", "C: Sent.");
                  Log.d("TCP", "C: Done.");
                  connectionAvailable = true;

             } catch(Exception e) {
                 Log.e("TCP", "S: Error", e);
                 connectionAvailable = false;

               } finally {
                  socket.close();
                  announceNetworkAvailability(connectionAvailable);
                }

         } catch (Exception e) {
              Log.e("TCP", "C: Error", e);
              announceNetworkAvailability(connectionAvailable);
         }
    }


}

Lorsque le serveur est indisponible, la ligne

Socket socket = new Socket(serverAddr, portNumber);

provoque un certain retard et je pense que c’est la cause de la pendaison. Mais si le service TCPClientService s’exécute dans son propre thread, je ne sais pas pourquoi cela a une incidence sur la temporisation de l’activité principale.

Je serais très reconnaissant à quiconque de montrer comment empêcher l'application de se suspendre lorsque le serveur est indisponible.

Était-ce utile?

La solution

La plate-forme Android exécute toujours des méthodes de cycle de vie pour les activités et les services dans le fil principal des événements. Vous créez donc un autre thread et appelez startService depuis celui-ci ... mais lorsque le service est créé et démarré, les méthodes onCreate (), etc., sont appelées à partir du thread d'événement principal, -not- à partir de votre thread utilisateur.

Pour ce faire, vous ne devez pas appeler startService depuis un autre thread, mais appeler startService normalement, puis laisser le service générer un thread de connexion à partir de onCreate ().

La solution de ssakl ne résout pas le problème fondamental dont j'ai peur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top