Как прервать работу asynctask, реализующий запрос по сети через сокеты?
ребята! Прошу Вас, подскажите как решить следующий вопрос: ...в отдельном потоке (использую asynctask, код приведен ниже) я подключаюсь к сокету сервера -> передаю данные -> жду ответа -> получаю данные -> закрываю сокет -> передаю результат в основной поток (в частности отключаю ProgressBar). Но бывает так, что сервер отвечает очень долго (или Инет плохо работает), и в такой момент мне нужно, не дожидаясь ответа от сервера закрыть сокет и завершить работу потока. Завершить работу потока я могу через проверку isCancelled() в doInBackground. Если isCancelled() = true, то я выхожу из потока через return null ничего не возвращая в onPostExecute. НО! Установить true, насколько я понимаю, можно только из UI потока. Может как-то можно установить true для проверки isCancelled() в самом потоке, а именно в doInBackground? Или как вообще правильно организовать это все? P.S. Немного обновил код и добавил тайм аут для сокета, но сам поток ведь продолжает работать, а значит я не могу вызвать его повторно (АсинкТаск на сколько я знаю вызывается лишь раз). Можно использовать executeOnExecutor для того, чтобы запустить параллельно еще один поток, но решит ли это мою проблему? Я считаю, что лучше разобраться в первом запущенном потоке, и предусмотреть в нем любой вариант развития событий.
Заранее большое спасибо!!!
public class ZaprosKSeti extends AsyncTask<String, Void, String> {
public String serverMessage = "Server message";
public interface AsyncResponse {
void processFinish(String output);
}
public AsyncResponse delegate = null;
public ZaprosKSeti(AsyncResponse delegate){
this.delegate = delegate;
}
@Override
protected String doInBackground(String... urls) {
String SamZaprosServeru = "CHEK";
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress("XXX.XXX.XXX.XXX", XXXX), 5000);
OutputStreamWriter sw = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");
BufferedWriter bw = new BufferedWriter(sw);
bw.write(SamZaprosServeru);
bw.flush();
if (socket.isConnected()) {
try {
InputStream in = socket.getInputStream();
InputStreamReader READ_From_Potok = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(READ_From_Potok);
String translatedMessage = br.readLine();
serverMessage = translatedMessage;
} catch(InterruptedIOException exception){
System.out.println(exception.getMessage());
}
socket.close();
} else {
socket.close();
return null;
}
} catch (InterruptedIOException exception) {
System.out.println(exception.getMessage());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return serverMessage;
}
@Override
protected void onPostExecute(String result) {
delegate.processFinish(result);
}
}