Как улучшить мои Rest Calls на Android? - PullRequest
0 голосов
/ 20 апреля 2011

Я делаю приложение для Android. Мне нравится делать остальные звонки как можно быстрее. Когда я получаю результаты в виде XML, требуется 5 секунд (!), Чтобы получить простой XML-код, подобный следующему:

   <souvenirs>
     <souvenir>
       <id>1</id>
       <name>Example 1</name>
       <rating>3.4</rating>
       <photourl>/images/example.jpg</photourl>
       <price>3.50</price>
     </souvenir>
     <souvenir>
       <id>2</id>
       <name>Example 2</name>
       <rating>2.4</rating>
       <photourl>/images/example.jpg</photourl>
       <price>8.50</price>
       </souvenir>
   </souvenirs>

Так что я попробовал это с JSON. Но это также занимает около 5 секунд, чтобы получить.

Я загружаю XML в Android с помощью следующего кода:

        URL url = new URL("http://example.nu?method=getAllSouvenirs");
            URLConnection conn = url.openConnection();
            long t=System.currentTimeMillis();

            InputStream ins = conn.getInputStream();
            Log.d("info", String.valueOf((System.currentTimeMillis()-t)));

В журнале говорится, что для получения входного потока требуется около 5000 мс. Есть ли способ ускорить это? Кто-нибудь знает, какую технику использует Android Market? Это загружается намного быстрее, чем мое приложение ..

Заранее спасибо! :)

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011

Когда вы пытаетесь получить данные «вручную» - через браузер или другими способами (wget, curl), сколько времени это займет там.

В Android вы также должны учитывать мобильную сеть, которая обычно значительно медленнее, чем для настольного компьютера. Также задержки больше.

Для меня это очень похоже на проблемы в бэкэнде (например, попытка решить IP-адрес клиента и, таким образом, отнятие у него много времени).

1 голос
/ 20 апреля 2011

использовать Apache HttpClient вместо URLConnection: HTTP-клиент Apache или URLConnection

РЕДАКТИРОВАТЬ (2012-02-07): больше не верно на новой платформе Android, пожалуйста, прочитайте: http://android -developers.blogspot.com / 2011/09 / androids-http-clients.html

0 голосов
/ 20 апреля 2011

Может быть, так оно и реализовано, и вы ничего не можете сделать.Это мое предположение.Мое мнение состоит в том, чтобы делать все основанные на соединении вещи в вашем собственном потоке (чтобы поместить в фоновом режиме) и на переднем плане (основной поток пользовательского интерфейса) развлекать пользователя.:)

Я немного поиграл с этим, и он работает достаточно быстро для меня ... Вот мой код:

private static HttpResponse doPost(String url, JSONStringer json) {
    try {
        HttpPost request = new HttpPost(url);
        StringEntity entity;
        entity = new StringEntity(json.toString());

        entity.setContentType("application/json;charset=UTF-8");
        entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json;charset=UTF-8"));
        request.setEntity(entity);

        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpResponse response = httpClient.execute(request);
            return response;
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return null;
}

И где-то еще я вызываю этот метод, например:

HttpResponse httpResponse = doPost(url, json);
BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));

У меня нормально работает ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...