Я делаю приложение, которое отправляет строку на сервер через сокет, а затем считывает результат после обработки этими данными сервера. Он работал отлично, когда это была моя задача переднего плана, но с тех пор я использовал AsyncTask, чтобы показать диалог процесса, когда связь сокета работает в фоновом режиме, и все начинает ломаться после того, как я прочитал вывод с сервера, а затем попытаюсь закрыть сокет.
private class Progressor extends AsyncTask<String, Void, Void> {
ProgressDialog dialog;
protected void onPreExecute() {
dialog = ProgressDialog.show(ClearTalkInputActivity.this, "Loading..", "Analyzing Text", true, false);
}
protected Void doInBackground(String... strings) {
String language = strings[0].toLowerCase();
String the_text = strings[1];
Socket socket = null;
DataOutputStream dos = null;
DataInputStream dis = null;
try {
socket = new Socket(my_ip, port);
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream());
dos.writeUTF(language+"****"+the_text);
String in = "";
while (in.indexOf("</content>") < 0) {
in += dis.readUTF();
}
socket.close();
save_str(OUTPUT_KEY, in);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
if (dos != null) {
try {
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (dis != null) {
try {
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
protected void onPostExecute() {
if (dialog.isShowing())
dialog.dismiss();
startActivity(new Intent (output_intent));
}
}
Рекомендуемым способом в Android является использование одного из двух включенных HttpClients:
Нет необходимости напрямую использовать сокеты. Эти клиенты многое делают для улучшения вашего опыта.
Вот статья блога разработчиков Android, в которой объясняются основы: http://android-developers.blogspot.de/2011/09/androids-http-clients.html