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
}
Свежие комментарии