2012-10-31 113 views
3

前段時間詢問和回答了此問題link。然而,答案並沒有幫助我。我處於與其他職位的OP類似的位置: 我有一個Asynctask,在該Asynctask中,我建立了與某個網站的連接,但是,大多數情況下,由於互聯網連接遲滯,連接需要一段時間。 我希望用戶能夠隨時停止嘗試連接。停止HttpURLConnection連接

public class DownloadWebHtml extends AsyncTask<String, Void, Map<String,ArrayList<ArrayList<String>>>> {   
     HttpURLConnection con = null; 

     @Override 
     protected void onPreExecute(){ 
      Button but = (Button) findViewById(301); 
      but.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        cancel(true); 
        con.disconnect(); 
       } 
      }); 
     } 

     @Override 
     protected Map<String, ArrayList<ArrayList<String>>> doInBackground(String... urlcodes) { 
      //stuff 
      BufferedReader in = null; 
      try { 
       URL url = new URL("some url"); 
       con = (HttpURLConnection) url.openConnection(); 
       in = new BufferedReader(new InputStreamReader(con.getInputStream(),Charset.forName("ISO-8859-1"))); 
       String line = ""; 
       while ((line = in.readLine()) != null && !isCancelled()) { 
        html.add(line); 
       } 
       in.close(); 
      } catch (MalformedURLException e) { 
       return null; 
      } catch (IOException e) { 
       return null; 
      } finally { 
       con.disconnect(); 
       if (in != null) { 
        try { 
         in.close(); 
        } catch (IOException e) { 
         Log.d("gettxt", e.getMessage()); 
        } 
       } 
      } 

      if(!html.isEmpty()) { 
       return //stuff; 
      } 
      return null; 

     } 

     @Override 
     protected void onCancelled(){ 
      //cancellation 
     } 


    //onpostexecute doing stuff 
} 

只要按下按鈕,整個AsyncTask就會在連接完成後纔會被取消。 是否有可能立即停止按鈕按下整個過程? 可以使用默認的httpurlconnection完成嗎?

我嘗試使用斷開連接來觸發異常,而con.getInputStream正忙,但它無法正常工作。

回答

1

我建議切換到Apache的HTTP Components。它很有魅力,並具有線程安全的abort方法,如outlined here

+3

對於大多數情況,http://android-developers.blogspot.com/2011/09/androids-http-clients.html建議使用Apache的HttpURLConnection。它看起來像我在做代碼一樣的事情,但我沒有問題在任何時候取消AsyncTask,雖然管道可能需要更多時間來關閉在後臺 – Shellum