2011-12-20 19 views
3

HttpDefaultClientのexecute()メソッドの実行メソッドに大きなパフォーマンス上の問題があります。HttpDefaultClientのexecute()が非常に遅い

私は現在、サーバーにデータを投稿し、JSONを受け取り、データを逆シリアル化するためにこれを使用しています。私の電話では8〜30秒かかります。私がWifiに切り替えると(それはかなり速いです、私のPCで同じコールが300msかかる)、それは3から8秒かかります。その時間の少なくとも90%が実行メソッドに費やされています。我々はまた、2秒に1以内に同じことを行うことが可能であるiOSアプリを開発

HttpPost post = new HttpPost(DEST_URL); 
    HashMap<String, String> params = req.getPostParams(); 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

    for (String key : params.keySet()) { 
     nameValuePairs.add(new BasicNameValuePair(key, params.get(key))); 
    } 

    post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
    post.setHeader(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
    HttpResponse response = httpClient.execute(post); // very slow! 

    return response; 

は、このコードを使用することです。 http(httpsは将来)のためのより速い方法がありますか?

このように、クライアントの作成:使用

 HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER; 
     final SSLSocketFactory socketFactory = SSLSocketFactory 
       .getSocketFactory(); 
     socketFactory 
       .setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); 

     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     registry.register(new Scheme("https", socketFactory, 443)); 
     HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); 

     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 

     HttpClient client = new DefaultHttpClient(params); 

:HTCワイルドファイア、アンドロイド2.2.1以上

+2

HttpUrlConnection、http://developer.android.com/reference/java/net/HttpURLConnection.htmlを試してください – logcat

+0

うわー、それはずっと高速です。私の現在のコードで1回、URL接続で1回、サービスを2回呼び出すテストアプリケーションでは、URL接続は700ms、HTTPクライアントは1700msでした – schlingel

+1

Androidの開発者によるこのブログ記事によると: http://android-developers.blogspot.com/2011/09/androids-http-clients.html、HttpUrlConnectionはHTTP通信を行うための「推奨された」方法のようです。しかし、彼らは改善が2.3以来と言います。奇妙な。おそらく、HTCは彼らが出荷した実装にパッチを当てたのだろうか? ;) – ArjunShankar

答えて

0

コードが正常に動作します。

私はHTTPClientのに次のように作成する場合:サーバーにデータを投稿する初めて

 DefaultHttpClient httpClient = new DefaultHttpClient(); 
    // httpclient 
    httpClient.getParams().setParameter(
      CoreConnectionPNames.CONNECTION_TIMEOUT, mConnectionTimeOut); 
    httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 
      mSocketTimeOut); 

をし、応答を得た、それは私に10--20秒を要しました。

私は上記の答えに続いてHttpClientを作成する場合。 初めてサーバーにデータを投稿して応答があった場合、わずか4秒で済み、うまく動作すると思います。