У меня есть приложение, которое выполняет вызовы веб-службы и отображает данные в пользовательском интерфейсе Android. Веб-сервис также используется для браузерной версии этого же приложения. Версия браузера, работающая в браузере Android, загружается быстрее, чем версия моего приложения для Android. В браузере страницы загружаются около 200 мс, в моем приложении около 1000 мс. Я думаю, что все должно быть наоборот, если все сделано правильно. Веб-сервис одинаков для обоих, вот мой код Android:
ByteArrayEntity entity = new ByteArrayEntity(OutBuf.toByteArray());
entity.setContentType("application/octet-stream");
HttpPost post = new HttpPost(myUrlHiddenForPrivacy);
post.setEntity(entity);
//post.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpClient httpClient;
if(CacheHttpClient == null)
CacheHttpClient = new DefaultHttpClient(params);
httpClient = CacheHttpClient;
HttpResponse response = httpClient.execute(post);
HttpEntity re = response.getEntity();
Input = new RemoteStream.Input(re.getContent());
Многое не показано, но, надеюсь, вы сможете понять основы и посмотреть, есть ли у меня какие-либо очевидные проблемы. Я пробовал с и без строки USE_EXPECT_CONTINUE, так как я читал, что иногда может помочь. Мой веб-сервер не требует аутентификации, поэтому я не думаю, что хочу этого в моем случае. Мой веб-сервис поддерживает сохранение соединения открытым, поэтому я добавил статическую переменную «CacheHttpClient», которая просто хранит эту переменную в памяти (глобальная статическая переменная), чтобы она использовалась повторно.
Я отправляю двоичные данные, всего около 200 байтов или около того, и возвращаю данные 5–20 КБ. Я не могу использовать XML или другое, потому что пока не могу обновить серверную часть.
В отладчике, работающем на эмуляторе, строка httpClient.execute (post) находится там, где тратится большая часть времени ... но в целом отладчик очень медленный, поэтому я бы предпочел профилировать на реальном устройстве. У меня нет устройства, к которому я могу подключиться и отладить, но у меня есть устройство, которое я использую для тестирования, некоторые из них. Есть ли простой способ добавить несколько точек профиля в мой код, которые я могу просмотреть на устройстве? Этот код работает как AsyncTask - я думал об обновлении TextView или строки заголовка с некоторой информацией профиля, но, возможно, есть что-то более простое, например, журнал профилей / отладки, в который я могу записать на устройстве?
.. или, может быть, кто-то может просто сказать мне, почему это медленно из опыта? :)
Редактировать: HttpClientCache определяется так:
public class Client
{
public static HttpClient CacheHttpClient = null;
}
Это класс внутри файла Client.java, того же класса, который содержит приведенный выше код. Поэтому я думаю, что это будет область применения?