ПроблемаКак остановить выполнение HttpConnection.getInputStream()?
Я бегу метод HttpsUrlConnection.getInputStream()
внутри AsyncTask.doInBackground()
, который работает от DialogFragment
.
Я хочу, чтобы он завершился, когда пользователь вышел из фрагмента.
Если я этого не сделаю, бесполезные данные будут продолжать загружаться в фоновом режиме.
То, что я пытался
Я попытался установить URLConnection
объект null
в onDismiss()
обратного вызова, но это не останавливает метод getInputStream()
от выполнения. Я не могу назвать mConnection.disconnect()
в потоке пользовательского интерфейса, и это было бы неэффективно в другой AsyncTask, так как они выполняются последовательно.
AsyncTask.cancel()
не полезен, так как он не остановит метод doInBackground()
.
Вопрос
Как заставить возврат из метода getInputStream()?
Код
По желанию @CarlosRobles, вот код моего doInBackground()
URL url = new URL(urlString);
setCurrentConnection((HttpsURLConnection) url.openConnection());
mCurrentConnection.setSSLSocketFactory(mSSLSocketFactory);
mCurrentConnection.connect();
int responseCode = mCurrentConnection.getResponseCode();
if (responseCode >= 400) {
throw new IOException("Bad response code");
}
Log.d(TAG, "response code: " + responseCode);
// TODO: Should call .close() if IOException happens here?
InputStream inputStream = mCurrentConnection.getInputStream();
String response = convertStreamToString(inputStream);
inputStream.close();
mCurrentConnection.disconnect();
return response;
Другие соображения
Я только что проверилвремя выполнения всей функции, указанной в приведенном выше фрагменте, и я только что нашел, что UrlConnection.getResponseCode()
, на сегодняшний день является функцией, использующей больше всего времени для запуска. Полагаю, это связано с призывом к UrlConnection.getInputStream()
внутри него. Позже, inputStream всегда кэшируется в объект соединения, поэтому UrlConnection.getInputstream()
почти не занимает время в моей функции.
Как насчет вызова вручную 'mTask = new YourAsyncTask(). Execute(); mTask.cancel (true); ' – Elshan
Взгляните на [RoboSpice] (https://github.com/octo-online/robospice). У них есть хорошая модель для обработки прекращенных действий. Возможно, вы можете скопировать некоторые идеи оттуда. И вам не нужно вызывать mConnection.disconnect из UI-Thread. Просто установите флаг volatile и отметьте этот флаг в логике загрузки. – hgoebl
@ Elshan Я уже это делаю. Это неэффективно, прочитайте вопрос. – doplumi