2013-05-20 33 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