Как сделать Http Получить быстрый запрос? - PullRequest
2 голосов
/ 08 сентября 2011

на самом деле у меня есть правильный код, который отправляет http-петицию в твиттер и получает некоторые твиты от пользователя, кодифицированного с помощью JSON (он получает файл .json)

Все в порядке, работает нормально, но занимает много времени, делая запрос, отлаживая. Я вижу, что проблема в линии HttpResponse response = httpclient.execute(httpget);

В этой строке застревает много секунд, когда количество твитов превышает 3 или 4 твита. Если вы запрашиваете 20 твитов, их получение занимает 10-15 секунд.

Это проблема метода java / android http get, который я использую, потому что, если я сделаю запрос по URL в Firefox, тогда он будет очень быстрым.

Как заставить этот http получить запрос более быстрым способом?

Это мой действительный и медленный код:

public List<String> RetrieveTweets(String name, int num) //da todas las posiciones dado un email
{
    // https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=charliesheen&count=2
    List<String> tweetsList= new ArrayList<String>(); 
    String result = "";
    //http get
    InputStream is=null;
    try{
            HttpClient httpclient = new DefaultHttpClient();
            HttpGet httpget = new HttpGet("https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=" + name +"&count="+ num);
            HttpResponse response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
    }catch(Exception e){
            Log.e("log_tag", "Error in http connection "+e.toString());
    }
    //convert response to string
    try{
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
            }
            is.close();
            result=sb.toString();
    }catch(Exception e){
            Log.e("log_tag", "Error converting result "+e.toString());
    }
    //parse json data
    try{
            JSONArray jArray = new JSONArray(result);
            for(int i=0;i<jArray.length();i++)
            {
                    JSONObject json_data = jArray.getJSONObject(i);
                    tweetsList.add(json_data.getString("text")); //text es el nombre del campo del tweet
            }
    }
    catch(JSONException e){
            Log.e("log_tag", "Error parsing data "+e.toString());
    }
    return tweetsList;
}

1 Ответ

1 голос
/ 08 сентября 2011

Требуется ли вам использовать https версию для получения статусов?Https будет медленнее, чем http из-за двух вещей:

  • При первоначальном соединении требуется согласование рукопожатия для определения алгоритма шифрования + ключ сеанса
  • После установления рукопожатия каждый способ связи требуетшифрование / дешифрование сообщения.

Если вам требуется SSL, вы можете попробовать создать экземпляр HttpClient один раз, а не каждый раз в методе.Надеемся, что он поддержит сеанс и тем самым позволит избежать рукопожатия, которое может быть дорогостоящим, если вы будете инициировать его каждый раз.

...