2017-09-13 6 views
0

J'ai créé une application dans laquelle j'ai le bouton Démarrer et lorsque je l'appuie, elle démarre le client Thread Service dans lequel le client Socket se connecte à mon PC via Server Socket et il fonctionne bien jusqu'à ce que l'application est effacée de la liste récente. La même chose ne se produit pas lorsque j'appuie sur le bouton Démarrer et exécute finish() pour fermer l'application. Le service s'exécute dans les deux cas, mais lorsque j'efface l'application de la liste récente, le service continue de fonctionner mais une erreur se produit dans mon application de serveur: "Abandon de la connexion causée par le logiciel: erreur d'écriture du socket". Et quand j'utilise finish() pour fermer l'application, il est également effacé de la liste récente, mais le service continue de fonctionner avec succès sans que le socket ne reçoive d'erreur.La connexion causée par le logiciel est interrompue: erreur d'écriture de la socket lors de l'effacement de l'application de la liste récente (exécution dans un thread différent d'un service)

Que dois-je faire?

Et désolé pour mon anglais, ce n'est pas ma langue maternelle.

MainActivity.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Intent serviceIntent = new Intent(getBaseContext(), ClientService.class); 
} 

//This is called when I click the start button 
public void ServiceToggle(View v) { 
    if (!isServiceRunning(ClientService.class)) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       startService(serviceIntent); 
      } 
     }).start(); 
    } else { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       stopService(serviceIntent); 
      } 
     }).start(); 
    } 
} 

ClientService.java

public class ClientService extends Service { 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onCreate(); 
     handler = new Handler(); 
     new Thread(new Client()).start(); 

     return START_STICKY; 
    } 

    class Client implements Runnable { 
     String message; 

     @Override 
     public void run() { 
      try { 
       socket = new Socket(IP, PORT); 

       objectInputStream = new ObjectInputStream(socket.getInputStream()); 

       while (true) { 
        message = (String) objectInputStream.readObject(); 

        UpdateOnUI(message); 
       } 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void UpdateOnUI(final String string) { 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(getApplicationContext(), string, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 

L'erreur provient du côté client (Android) pas du côté serveur (Windows) et est différent des autres questions posées dans Stack overflow. Cette erreur est levée lorsque l'application est fermée à partir de la tâche, que le service continue à fonctionner et que le socket est implémenté dans le service, et que le service arrive à la fermeture de l'activité et non au service.

+0

Veuillez ajouter le code de l'activité et le service. –

+0

Si j'utilise finish() après startService (serviceIntent); dans MainActivity pour fermer l'application, l'erreur dont j'ai parlé ne se produit pas. –

+0

@Jens Les raisons officielles de ce message sont telles que citées dans le duplicata, que vous le sachiez ou non. – EJP

Répondre

0

Cela fonctionne maintenant. Juste nécessaire pour faire fonctionner le service au premier plan. Le faire en premier plan ne fonctionnait pas auparavant à cause d'une erreur stupide, je le faisais dans un autre thread mais j'ai oublié de l'exécuter (n'appelait pas .start()).