Android: первые грабли

На русском очень мало документации по андроиду поэтому я немного попишу на эту тему.

Как вы уже знаете взялся я настругать на коленке e-banking. Первых два дня дико тупил и читал доки. На самом деле все интуитивно просто как в Убунте ;) Но как и везде есть грабли. Об одних я и хочу тут написать.

Для работы приложению надо по HTTPS связываться с сервером и получать xml. Для соединения я выбрал самый простой способ и использовал объект URLConnection
URL url = new URL("https://liqpay.com/?do=api_xml");
URLConnection conn = url.openConnection();

Все было хорошо пока я не начал отлаживать второй проход по сценарию, то есть первый раз перевели денег и снова возвращаемся на исходную страницу для второго перевода. Тут началв вылазить ошибка «Приложение выполнило недопустимую операцию и будет закрыто», или как-то так.

Я сначала подумал ошибка где-то в потоках, потому что я первый раз использовал потоки вообще. Стал смотреть вроде с потоками все ок. Посмотрел может я не закрыл прошлое соединение, оно закрывается после закрытия потока. В результате добрался до того что поток изначально получается закрытым. И никакого null-pointer или другого исключения не вываливается.

Долго ли коротко ли гуглил и нашел что не у одного меня такая проблема. Воркэраунд был простой, открывается каждое нечетное соединение то есть 1,3,5… Но это естественно не дело. Стал искать как делают реальные пацаны. а реальные пацаны оказывается использую класс DefaultHttpClient с которым все ок. Вот сейчас проделал пару тестов все действительно нормально пашет, собираюсь внести изменения в проект. А пока побалую вас рабочим кодом, мож кому пригодится.
String xmlContentToSend = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><request></request>";

DefaultHttpClient httpClient = new DefaultHttpClient();
// some weird header
// http://doookstechstuff.blogspot.com/2009/06/switching-off-expect-100-continue.html
httpClient.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
// Using POST or    new HttpGet
HttpPost httpPost = new HttpPost("https://liqpay.com/?do=api_xml");
// some headers 
httpPost.addHeader("Accept", "text/xml");
httpPost.addHeader("Content-Type", "application/xml");

try {
    // convert xml to StringEntity
    StringEntity entity = new StringEntity(xmlContentToSend, HTTP.UTF_8);
    entity.setContentType("application/xml");
    httpPost.setEntity(entity);

    // or use NameValuePair 
    /*
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("name", "value"));
    httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
    */

    // execute is a blocking call, it's best to call this code in a thread separate from the ui's
    HttpResponse response = httpClient.execute(httpPost);

    InputStream stream = response.getEntity().getContent();
}
catch (Exception ex) {
    // logging
}
Теги:
Android
Добавлено: 15 Сентября 2013 02:53:28 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...