Программирование на 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
    


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

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

    Метки:
    Поделиться публикацией
    Комментарии 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

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