Ich entwickle eine Anwendung in Android, die über TCP-Sockets eine Verbindung zu einem Server herstellt. Ich verwende AsynkTask, um eine Verbindung mit der Anwendung herzustellen.Soll ich AsyncTask in Android verwenden, um eine Socket-Verbindung zu verwalten?
Die Anwendung trennt sich während ihres gesamten Lebenszyklus nicht vom Server. Selbst wenn die Anwendung in den Ruhezustand geht, läuft die AsynkTask weiter und der Socket ist immer verbunden.
Die Socket nur getrennt wird, wenn der Server den Socket geschlossen (weil eine Ausnahme throwed und die doInBackground() finish), oder wenn der User-Exit die Anwendung (weil die AsyncTask abgebrochen)
Das ist mein doInBackground()
@Override
public Void doInBackground(Void ...pa){
try {
sock = new Socket(InetAddress.getByName(serv), port);
}
catch(IOException ex) { errMessage = ex.getMessage() + "\n"; }
try {
if(sock != null) {
inStr = new DataInputStream(sock.getInputStream());
outStr = new DataOutputStream(sock.getOutputStream());
while(!isCancelled()) {
if(((hbDataSize = inStr.read()) & 0xC0) == 0xC0){
lbDataSize = inStr.read();
packetSize = (hbDataSize << 8 & 0x3F00) + lbDataSize;
buffer = new byte[packetSize-2];
inStr.read(buffer, 0, packetSize-2);
publishProgress(0);
}
}
} else {
throw new IOException(errMessage);
}
}catch(IOException e) { // sin conexion salta a a excepcion
errMessage = e.getMessage();
publishProgress(2);
isError = true;
}
return null;
}
Auf jeden Fall stelle ich nur den Code, so dass Sie die Methode sehen kann.
Ich fange an, über AsyncTask zu lesen, und es heißt, dass ich eine AsyncTask für längere Zeit verwenden sollte.
AsyncTasks sollte idealerweise für kurze Operationen (ein paar Sekunden am meisten.) Verwendet werden, wenn Sie für längere Zeit laufende Threads halten müssen, ist es dringend empfohlen, dass Sie die verschiedenen APIs, die von der Java bereitgestellt verwenden. util.concurrent Paket wie Executor, ThreadPoolExecutor und FutureTask.
Meine app funktioniert gut, aber sollte ich die AsyncTask für einen Executor zu ändern, oder eine ThreadPoolExecutor oder FutureTask? Und wenn Sie denken, ich sollte es ändern, warum sollte ich es ändern? Ich habe über diese drei Klassen gelesen, aber ich bin nicht sicher, ob ich es ändern sollte.
Aus der Nutzung sieht es sogar eher wie eine gebundene Service-Sache? – SergeyA
Future/Threadpool/Executor sind nützlich, wenn Sie mehr/viele Aufgaben haben, die länger laufen oder komplexes Threading mit Limits/Aufgabenabhängigkeiten und so weiter. Der Lauf für lange Zeiträume bedeutet z.B. dass mehrere lange laufende Aufgaben gestartet werden können und Executor/Threadpool/Future verwendet werden kann, um die Anzahl der gleichzeitig operierenden Threads, Ausführungsreihenfolge, Inline-Ausführung usw. zu steuern. Eine _Task_ ist mehr eine endliche Operation/ein Job wie _calculate x_, _download file_ und so weiter. Ihr Fall sieht - wie SergeyA schrieb - eher aus wie ein (gebundener) Dienst oder einfach ein separater Thread, der weiterläuft. – makadev
Vielen Dank für Ihre Antworten, ich werde einen Dienst für meine Operation verwenden – mavi