Главная > JAVA, Программирование > Android: первые грабли

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

14 Сентябрь 2009

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

Как вы уже знаете взялся я настругать на коленке 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
}
  1. petya
    14 Сентябрь 2009 в 22:18 | #1
    Еще одни грабли в дагонку, когда начнешь использовать реальное ssl соединение(с обменом ключа) тебе куда то нужно будет сохранять ключик... если заранее этого не предусмотреть, можно долго ловить багу...
  2. 14 Сентябрь 2009 в 22:20 | #2
    Да, спасибо, я уже читал об этом. Надеюсь не пригодится :)
  3. 14 Сентябрь 2009 в 23:55 | #3
    да кому это нужно, все равно скоро все умрем )))
  4. 15 Сентябрь 2009 в 08:59 | #4
    ага поэтому согласно твоей теории надо пить, играть в блэк джек и трахать шлюх :)
  5. 24 Сентябрь 2009 в 02:59 | #5
    пипец у них идеология ... 1,3,5,7 ...
  6. 24 Сентябрь 2009 в 20:25 | #6
    это был просто баг в SDK 1,6 все поправили
Комментирование отключено.