Это мой первый вопрос о переполнении стека. Обычно я могу найти ответы самостоятельно, но на этот раз я не могу найти достойный ответ нигде. Я также новичок в создании приложений для Android, поэтому извините заранее за мои нообы.Как отменить HTTP-запрос
Как отменить HTTP-запрос в «android java» после x miliseconds, когда локальный IP-адрес недоступен? Я запрашиваю html-страницу с помощью AsyncTask. Код класса приведен ниже.
У меня теперь есть таймер, определенный в onPreExecute(), который устанавливает onCancel() в true после X miliseconds. doInBackground() открывает поток и т. Д., После чего он записывает поток в строку.
Проблема заключается в том, что, когда локальный адрес ip недоступен, функция url.openStream() продолжает работать до тех пор, пока java.net.ConnectException не выйдет из-за timeOut. Я не знаю, как перехватить эту команду, используя onCancel() (если это возможно).
Итак, как мне перехватить команду url.openStream? или просто прекратить поток AsyncTask в целом?
private class htmlToString extends AsyncTask<Void,Void,Void> {
public htmlToString asyncObj;
@Override
protected void onPreExecute(){
asyncObj = this;
new CountDownTimer(connectionTimeout, connectionTimeout) {
public void onTick(long millisUntilFinished) {}
public void onFinish() {
// stop async task if not in progress
if (asyncObj.getStatus() == AsyncTask.Status.RUNNING) {
asyncObj.cancel(true); // <- how can i cancel the doInBackground with this ?
Log.i("timer", "...still trying to connect...");
}
}
}.start();
}
@Override
protected Void doInBackground(Void... params) {
try {
URL url = new URL(url_string[button_state]);
final InputStream url_inputstream = url.openStream(); // <- if the local ip adress is unavailable, this command keeps running until ETIMEDOUT kicks in
InputStreamReader url_inputstreamreader = new InputStreamReader(url_inputstream);
BufferedReader in = new BufferedReader(url_inputstreamreader);
String inputLine;
while ((inputLine = in.readLine()) != null)
page = page.concat(inputLine);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void params){
// some code
}
}
Edit1: Это сделано в Android Studio 1.5.1
edit2: Я решил это самостоятельно. Я просто сокращаю время, заданное java. Я сделал это в doInBackground() (код приведен ниже). Это также означало, что я мог полностью отказаться от таймера внутри onPreExecute().
@Override
protected Void doInBackground(Void... params) {
try {
URL url = new URL(url_string[button_state]);
URLConnection url_connection = url.openConnection();
url_connection.setConnectTimeout(connectionTimeout); // timout is set here
final InputStream url_inputstream = url_connection.getInputStream();
InputStreamReader url_inputstreamreader = new InputStreamReader(url_inputstream);
BufferedReader in = new BufferedReader(url_inputstreamreader);
String inputLine;
while ((inputLine = in.readLine()) != null)
page = page.concat(inputLine);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
Где я поставить этот код? Я также получаю следующее сообщение об ошибке: «Не удается разрешить символ« httpclient ». Я попытался включить его в функцию «onfinish» таймера. Я также попытался заменить httpclient на asyncObj. Плюс я также попытался поместить его в main -> oncreate() и заменил httpclient классом htmlToString, который я вызвал, но затем я получаю сообщение об ошибке: «не удается разрешить символ« getConnectionManager »« – Malone