2016-02-01 4 views
5

Это мой первый вопрос о переполнении стека. Обычно я могу найти ответы самостоятельно, но на этот раз я не могу найти достойный ответ нигде. Я также новичок в создании приложений для 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; 
    } 

ответ

2

httpclient.getConnectionManager().shutdown();

+0

Где я поставить этот код? Я также получаю следующее сообщение об ошибке: «Не удается разрешить символ« httpclient ». Я попытался включить его в функцию «onfinish» таймера. Я также попытался заменить httpclient на asyncObj. Плюс я также попытался поместить его в main -> oncreate() и заменил httpclient классом htmlToString, который я вызвал, но затем я получаю сообщение об ошибке: «не удается разрешить символ« getConnectionManager »« – Malone

2

вы можете обратиться ниже код для отмены запроса

httpget.abort(); 

пример:

import org.apache.http.client.methods.CloseableHttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClients; 



public class ClientAbortMethod { 

    public final static void main(String[] args) throws Exception { 
     CloseableHttpClient httpclient = HttpClients.createDefault(); 
     try { 
      HttpGet httpget = new HttpGet(<URL>); 

      System.out.println("Executing request " + httpget.getURI()); 
      CloseableHttpResponse response = httpclient.execute(httpget); 
      try { 
       System.out.println("----------------------------------------"); 
       System.out.println(response.getStatusLine()); 

       // Call abort on the request object 
       httpget.abort(); 
      } finally { 
       response.close(); 
      } 
     } finally { 
      httpclient.close(); 
     } 
    } 

} 
+0

. Я получаю следующие ошибки : Не удается разрешить символ «ClosableHttpClient», не может разрешить символ «httpclients», не может разрешить символ «getUri», не может разрешить символ «getStatusLine», не может разрешить символ «abort» не может разрешить символ «закрыть» – Malone

+0

, о котором вы хотели бы поделиться те ошибки – Musaddique

+0

я попал слишком рано, извините, но я исправил его – Malone

Смежные вопросы