2013-05-20 50 views
3

因爲要去link當我在後臺打開一個URL其「喜歡」的文章3020的Android - HttpClient的只能使用一次

我與HttpClient的這樣做:

public static class LoadURL extends AsyncTask<Void, Integer, Void>{ 

       @Override 
       protected Void doInBackground(Void... params) { 
        try { 
       second_client = new DefaultHttpClient(); 
       String getURL = "http://website.com/" + id_string + "/like/"; 
       HttpGet get = new HttpGet(getURL); 
       HttpResponse responseGet = second_client.execute(get, cookieStuff); 

       Log.i("Response", String.valueOf(response.getStatusLine().getStatusCode())); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
       return null; 

       } 

       @Override 
       protected void onPostExecute(Void result) { 
       super.onPostExecute(result); 
       Toast.makeText(AFragment.context, "Article liked", Toast.LENGTH_LONG).show(); 
       } 
     } 

問題是有很多文章(3020-3021-3022等),所以用戶會多次點擊'like'按鈕。這意味着LoadURL任務多次完成,但它僅在第一次運行。所有時間之後,它需要5分鐘以上。

有人知道如何解決這個問題嗎?還是有比使用HttpClient更好的方法?

+0

asynctask在單線程上運行。他們不會平行運行。您可以使用執行程序來實現此目的.http://developer.android.com/reference/java/util/concurrent/ExecutorService.html。 http://developer.android.com/reference/java/util/concurrent/Executor.html – Raghunandan

+0

所以在onPostExecute我必須殺死AsyncTask?你能解釋一下嗎? – GromDroid

+0

你是如何執行AsyncTask的,每次點擊按鈕創建AsyncTask對象? –

回答

4

您確定網絡服務器運行良好嗎? 1.您應該做的第一件事是創建一個DefaultHttpsClient的靜態實例,並且每次都使用相同的實例,它應該運行良好,我已經使用了很多次。 2.看看volley,它是一個新的圖書館穀歌已經發布了網絡

0

您需要實例客戶只有一次,使用重複使用ThreadedClientConnManager

HttpClient mClient; 
HttpParams params = new BasicHttpParams(); 
     ConnManagerParams.setMaxTotalConnections(params, 100); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 

     SchemeRegistry schemeRegistry = new SchemeRegistry(); 
     schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     schemeRegistry.register(new Scheme ("https", SSLSocketFactory.getSocketFactory(), 443)); 

     ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); 

     mClient = new DefaultHttpClient(cm, params); 

現在只需再次使用客戶端

public static class LoadURL extends AsyncTask<Void, Integer, Void>{ 

       @Override 
       protected Void doInBackground(Void... params) { 
        try { 

       String getURL = "http://website.com/" + id_string + "/like/"; 
       HttpGet get = new HttpGet(getURL); 
       HttpResponse responseGet = mClient.execute(get, cookieStuff); 

       Log.i("Response", String.valueOf(response.getStatusLine().getStatusCode())); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
       return null; 

       } 

       @Override 
       protected void onPostExecute(Void result) { 
       super.onPostExecute(result); 
       Toast.makeText(AFragment.context, "Article liked", Toast.LENGTH_LONG).show(); 
       } 
     } 
+0

我必須把HttpClient的東西放在onCreate? – GromDroid

+0

是的,你可以,它會正常工作。但更好的做法是爲http請求創建單獨的類,或者使用IntentServices – Greensy

+0

這可行! :D但有時候還是需要一些時間..你也許知道是否有更好的方法而不是使用HttpGet? @Greensy – GromDroid