Скачать данные с сервера в Android 2.1 - PullRequest
2 голосов
/ 03 марта 2012

Я хочу загрузить некоторые контакты, сохраненные на моем онлайн-сервере, а затем отобразить их в своей деятельности. Я написал сервис и даю фрагмент кода из функции onStartCommand, где выполняется загрузка.

public int onStartCommand(Intent intent, int flags, int startId)
{
    String responseStr = "";
    try
    {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(URL);          

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("action", "get_contact"));
        nameValuePairs.add(new BasicNameValuePair("uId", uId + ""));
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse httpResponse = httpClient.execute(httpPost);

        BufferedReader in = new BufferedReader (new InputStreamReader(httpResponse.getEntity().getContent()));
        responseStr = in.readLine();        
        in.close();
    }
    catch (ClientProtocolException e)
    {
        Log.e("EXCEPTION", "ClientProtocolException");
    }
    catch (IOException e)
    {
        Log.e("EXCEPTION", "IOException");
    }
    this.stopSelf();

    return Service.START_STICKY;
}

Но проблема с этим кодом в том, что загрузка данных занимает слишком много времени. Пожалуйста, предложите мне любой способ быстро загрузить и отобразить эти данные в моей деятельности.

Заранее спасибо за помощь.

Ответы [ 4 ]

0 голосов
/ 09 марта 2012

Я заметил, что вы не выполняете загрузку в качестве фоновой задачи. Если ваш сервис не работает как отдельный процесс от вашей основной деятельности, этот код будет выполняться в основном потоке приложения (UI) приложения и негативно повлиять на ваших пользователей. Я бы порекомендовал вам переместить код в AsyncTask или поток, запущенный из onStartCommand. Затем я использовал бы обратный вызов из службы, чтобы уведомить активность, что данные доступны для отображения. Также, как рекомендует Дмитрий, нумерация страниц также может помочь вам в фактической продолжительности загрузки.

0 голосов
/ 03 марта 2012

Нет гарантии, что вы не будете испытывать медленную загрузку или тайм-ауты даже после включения сжатия на уровне HTTP.В конце концов, вы имеете дело с неограниченным набором данных, и то, что работает в вашей среде разработки, может не работать в полевых условиях с очень медленным соединением, где у пользователя может быть 25000 контактов с очень длинным именем.Возможно, стоит посмотреть на проблему в целом, учитывая, действительно ли вам нужно сразу загрузить все данные.Вы можете использовать какую-то нумерацию страниц (см., Например, этот вопрос и / или используйте EndlessAdapter ).

0 голосов
/ 04 марта 2012

Попробуйте вместо этого использовать сокетное соединение.

0 голосов
/ 03 марта 2012

Что ж, если ваш сервер или соединение медленное, вы мало что можете сделать с вашим клиентским кодом.

Но вам определенно следует рассмотреть возможность сжатия ответов от вашего веб-сервера и кода клиента, добавьте заголовок:

Accept-Encoding: gzip

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