Пользователь
0,0
рейтинг
9 января 2013 в 20:57

Программирование на Android для web разработчика или быстрый старт для самых маленьких. Часть 2

Приветствую!

Статья является продолжением начатой мной части 1.

Предостережение


Важно: данный урок не является профессиональным. Автор урока не является специалистом в программировании для платформы Android. Я заранее приношу свои извинения, за неоправданные ожидания.

RegistrationActivity


В Activity для регистрации нужно проделать следующее:
  • 1. Прочесть данные формы
  • 2. Validation на стороне клиента (опционально и мной не реализовано)
  • 3. Запрос к серверу в фоновом потоке
  • 4. Обработка ответа сервера

Чтение формы элементарно и осложнений вызвать не должно:

final EditText login = (EditText)findViewById(R.id.login);
final EditText password = (EditText)findViewById(R.id.password);
final EditText password2 = (EditText)findViewById(R.id.password2); // при желании сравнить пароли


Работ с сетью в новом потоке


Используя AsyncTask создадим фоновый поток:

// 3 параметр это тип возвращаемых данных методом doInBackground, его я буду обрабатывать в onPostExecute
class AsyncTaskExample extends AsyncTask<Void, Integer, String> {
					
                    // фоновая работа
					@Override
					protected String doInBackground(Void... params) {
						
					}
                    // выполняется после doInBackground, имеет доступ к UI
					protected void onPostExecute(String result) {

						} catch (JSONException e) {
							
							e.printStackTrace();
						}
						
						
			        }

}
				// запуск потока
				new AsyncTaskExample().execute();


Запросы к серверу я вынес в отдельный класс (классы размещаются в той же паке что и Activity). Метод класса принимает логин, пароль и возвращает ответ сервера. Может выглядеть примерно так:

public class ServerSendData {

	private static String server = "http://xxx.xxx.x.xxx/";
	public static String mlogin = null;
	public static String mpassword = null;

	public static String sendRegData(String login,String password) {

		String result = null;
		mlogin = login;
		mpassword = password;

		try {
			URL url = new URL("" + server + "apiregistration/create/"+mlogin+"/"+mpassword+"");
			
			URLConnection connection = url.openConnection();
			HttpURLConnection httpConnection = (HttpURLConnection)connection;

			int responseCode = httpConnection.getResponseCode();

			if (responseCode == HttpURLConnection.HTTP_OK) {
				InputStream in = httpConnection.getInputStream();
				BufferedReader r = new BufferedReader(new InputStreamReader(in));
                                
				result = r.readLine();

				Log.w("res",""+result+"");


			} else
			{
				
			}


		} 
		catch (MalformedURLException e) {}
		catch (IOException e1) {}

		return result;
	}

Стоит отметить, что мой сервер общается на JSON. Ответ выглядит так:

{"status":"login_busy"}

Далее, дело техники. Обращаемся к классу в методе doInBackground:

return ServerSendData.sendRegData(""+login.getText().toString()+"",""+ password.getText().toString()+"");

В onPostExecute работаем с результатом:

JSONObject object = new JSONObject(result);
String status = object.getString("status");
// status будет содержать login_busy


Для экономии моего времени и ваших нервных клеток, я осмелюсь прикрепить опрос.
Урок полезен?

Проголосовало 495 человек. Воздержалось 239 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

@p4p
карма
–5,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (17)

  • +3
    Важно: данный урок не является профессиональным. Автор урока не является специалистом в программировании для платформы Android. Я заранее приношу свои извинения, за неоправданные ожидания.

    Тут комментарий, в группе Хабра, мол:
    мде… «Предостережение Важно: данный урок не является профессиональным.»
    Зачем он тогда вообще нужен?

    Но человек ведь старался и я не вижу причин не похвалить его. Я даже сюда решил ответить.
    Так держать! :)
  • +2
    ""+login.getText().toString()+"",""+ password.getText().toString()+""
    


    Huh? O_o
    Зачем кавычки?
    P.S. onPostExecute упадёт с nullpointerexception, угадайте, когда
    • 0
      Так вроде result не будет null. Или я не туда смотрю?
      • 0
        Если там что-то может возвращать null, то упадет NullPointerException на методе .toString(). Кавычки от этого вроде не помогают :)
      • 0
        Будет null, когда нет сети
  • +5
    Константы принято выделять заглавными:
     private static String server = "http://xxx.xxx.x.xxx/";

    private static String SERVER= "http://xxx.xxx.x.xxx/";

    Эксепшены лучше было бы сделать так:
    catch (MalformedURLException e) {
    Log.e(..., e.getStackTrace())
    }

    Для логгера лучше вынести метку в начало класса:
     private static String TAG = "tag";
     Log.w(TAG,""+result+"");
    

    Не понял для чего вы используете пустые строки.
    Инициализировать поля лучше в конструкторе.
    Это просто поверхностный ревью…
    • +3
      Лучше даже
      private static final String SERVER = «xxx.xxx.x.xxx/»;
      • –1
        Согласен, прошляпил.
        А еще лучше так
        private static final String DEFAULT_SERVER = «xxx.xxx.x.xxx/»;
    • 0
      Если заговорили о константах, то принято писать статические члены класса с префиксом s, а переменные объекта класса с префиксом m.
      Т.е. должно быть хотя бы так
        public static final String DEFAULT_SERVER = "xxx.xxx.x.xxx/"; //Константа, прописные буквы
        public static String sLogin = null; //Статические переменные, lowerCamelCase
        public static String sPassword = null;
      


      Ну и вообще, это личное дело каждого, как засерить свой код :)
  • 0
    Раз уж тут для самых маленьких, подскажите, как сделать для игры общение с сервером? Она общается через websocket, получая и передавая данные периодически. Я правильно понимаю, что бы это соединение не рвалось (например при сворачивании игры или переходе в другую активность) его нужно выносить в сервис и общаться игровыми данными уже с сервисом? Или есть какие-то альтернативы?
    • +1
      Общение с сетью надо выносить в отдельный тред, а при сворачивании приложения надо его закрывать обязательно. Если надо сохранять коннект между активити, то выносить в сервис. Но при сворачивании приложения всё-равно убивать, иначе пользователи рады не будут.
  • +2
    Для тех, кому не нужно объяснять, что такое while/if/for/абстрактный класс/интерфейс рекомендую скринкатсы thenewboston по android
    Кое где код у меня вызывал сомнения, но зато нету пустой болтовни о вещах, которые знает каждый программист
  • 0
    А еще строка
    return ServerSendData.sendRegData(""+login.getText().toString()+"",""+ password.getText().toString()+"");
    

    подразумевает, что login и password — EditText, а у вас прописаны, как строки.
    Короче, исправляйте
    • 0
      а разве строки
      final EditText login = (EditText)findViewById(R.id.login);
      final EditText password = (EditText)findViewById(R.id.password);

      не говорят, что login и password — всё же EditText?
      • 0
        Точно, вон они где. Извиняюсь, просмотрел
  • +3
    Ух ты, какой гаденький код!
    Хорошие туториалы по андроид (например про те же фоновые процессы):
    www.vogella.com/articles/AndroidBackgroundProcessing/article.html
  • 0
    x

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.