2013-05-20 2 views
3

Я открытия URL в фоновом режиме, так как при переходе к link он «любит» статью 3020Android - 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 и т. Д.), Поэтому пользователь будет нажимать несколько раз кнопку «как». Это означает, что задача 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, это новая библиотека Google выпустила для сетевых

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

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