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
}

6 Комментарии “Android: первые грабли

  1. Еще одни грабли в дагонку, когда начнешь использовать реальное ssl соединение(с обменом ключа) тебе куда то нужно будет сохранять ключик… если заранее этого не предусмотреть, можно долго ловить багу…

  2. ага поэтому согласно твоей теории надо пить, играть в блэк джек и трахать шлюх :)

Комментарии закрыты