Je suis confronté à un problème avec les discussions et les prises que je ne peux pas comprendre, si quelqu'un peut m'aider s'il vous plaît je voudrais vraiment apprécier.Sockets, Threads et Services dans Android, comment les faire fonctionner ensemble?
Il y a les faits:
J'ai une classe de service NetworkService, dans cette classe, j'ai un attribut Socket. Je voudrais qu'il soit à l'état de connecté pour l'ensemble du cycle de vie du service.
Pour connecter le socket je le fais dans un thread, donc si le serveur doit expirer, il ne bloquerait pas mon thread d'interface utilisateur. Problème est, dans le fil où je connecte ma socket tout va bien, il est connecté et je peux parler à mon serveur, une fois ce thread est terminé et j'essaie de réutiliser le socket, dans un autre thread, j'ai le message d'erreur Socket is not connected
. Les questions sont les suivantes: - La prise est-elle déconnectée automatiquement à la fin du filetage? - Est-ce que de toute façon nous pouvons renvoyer une valeur d'un thread appelé à l'appelant?
Merci beaucoup,
Voici mon code
public class NetworkService extends Service {
private Socket mSocket = new Socket();
private void _connectSocket(String addr, int port) {
Runnable connect = new connectSocket(this.mSocket, addr, port);
new Thread(connect).start();
}
private void _authentification() {
Runnable auth = new authentification();
new Thread(auth).start();
}
private INetwork.Stub mBinder = new INetwork.Stub() {
@Override
public int doConnect(String addr, int port) throws RemoteException {
_connectSocket(addr, port);
_authentification();
return 0;
}
};
class connectSocket implements Runnable {
String addrSocket;
int portSocket;
int TIMEOUT=5000;
public connectSocket(String addr, int port) {
addrSocket = addr;
portSocket = port;
}
@Override
public void run() {
SocketAddress socketAddress = new InetSocketAddress(addrSocket, portSocket);
try {
mSocket.connect(socketAddress, TIMEOUT);
PrintWriter out = new PrintWriter(mSocket.getOutputStream(), true);
out.println("test42");
Log.i("connectSocket()", "Connection Succesful");
} catch (IOException e) {
Log.e("connectSocket()", e.getMessage());
e.printStackTrace();
}
}
}
class authentification implements Runnable {
private String constructFirstConnectQuery() {
String query = "toto";
return query;
}
@Override
public void run() {
BufferedReader in;
PrintWriter out;
String line = "";
try {
in = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
out = new PrintWriter(mSocket.getOutputStream(), true);
out.println(constructFirstConnectQuery());
while (mSocket.isConnected()) {
line = in.readLine();
Log.e("LINE", "[Current]- " + line);
}
}
catch (IOException e) {e.printStackTrace();}
}
}
Avez-vous déjà découvert cela? J'ai le même problème. – Gourneau