Как прервать работу 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);
}

}


Ответы (0 шт):