2016-02-01 8 views
5

これは、スタックオーバーフローに関する私の最初の質問です。通常、私は自分で答えを見つけることができますが、今度はまともな答えを見つけることができません。私はアンドロイド向けのアプリも作っているので、あまりにも前から申し訳ありません。httpリクエストをキャンセルする方法

ローカルIPアドレスが利用できないときに、xミリ秒後に 'android java'でhttpリクエストをキャンセルするにはどうすればよいですか? 私はAsyncTaskを使用してhtmlページをリクエストしています。クラスのコードを以下に示します。

今私が持っているのは、onPreExecute()で定義されたtimerで、Xミリ秒後にonCancel()をtrueに設定します。 doInBackground()はストリームなどを開き、その後ストリームを文字列に書き込みます。

ローカルIPアドレスが利用できない場合、url.openStream()関数はtimeOutのためにjava.net.ConnectExceptionが起動するまで実行され続けます。私は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」を解決できません。シンボル「close」 – Malone

+0

エラー。これらのエラー – Musaddique

+0

私はあまりにも早く入力します、申し訳ありませんが、私はそれを訂正 – Malone

関連する問題