Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
smwed
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 8
#1

Нужен совет по правильной логике для авторизации пользователя при запуске приложения

29.04.2016, 19:58. Просмотров 875. Ответов 20
Метки нет (Все метки)

Новичок в java и android, так что прошу сильно не пинать за терминологию

Итак. Хочу ради самообучения сделать приложение, которое будет при старте (сразу после показа основного layout) пытаться авторизоваться на веб-сервере: для этого отправлять запрос get вида http//myserver/auth?l=login&p=password (логин и пароль читаются из сохраненных настроек) и дожидаться ответ.

Если логин и пароль не заданы или авторизация на сервере не успешна, то выводить на экран активити с полями ввода логина, пароля и кнопками "войти" и "закрыть".

По кнопке "Войти" - попытка авторизации на сервере. Если успешна, то возврат на основное активити, если не успешна - остаемся на активити с вводом логина/пароля.

По кнопке "Закрыть" надо закрыть все приложение.

На данный момент есть основное активити Main, есть активити с Логином/Паролем actAuth, есть класс сохраняющий и получающий настройки.

На данный момент сделал только так:
в Main в OnCreate запускаю процесс авторизации с помощью AsyncTask. Но поскольку результат получаю с помощью .get() то пока не пройдет процесс авторизации или не кончится тайм-оут основное окно не отрисовано и кажется, что приложение висит. Пытался вывести информацию через ProgressDialog, но он тоже отрисовывается только после процесса авторизации - оно и понятно весь UI заблокирован из-за .get()


Подскажите правильную архитектуру подобной задачи, или ссылку на исходники где есть подобная логика.

Спасибо.

Добавлено через 7 минут
Добавлю:
В onResume у Main проверял: если нет авторизации, то закрывал приложение через finish() т.к. в onResume исполнение попадало только если активити с логином/паролем закрывалось...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2016, 19:58
Ответы с готовыми решениями:

Нужен совет в выборе языка для приложения
Добрый день Дамы и Господа! Нужна помощь в выборе языка для приложения....

Ребят нужен технический совет по созданию приложения для для вывода ошибок с сервера
Здравствуйте, тут такое дело, в программировании android приложений я новичок,...

Авторизация пользователя при запуске приложения. Домен
Добрый день, есть такой вопрос, нужно организовать такую штуку: Пользователь...

Нужен совет по выбору шаблона для веб приложения
Добрый день. Нужно сделать прототип вебприложения похожего на сервис...

Нужен совет по ограничению действий пользователя
Есть приложение, достаточно объемное. Главная форма, на ней сплит контроллер, в...

20
SergioO
168 / 184 / 90
Регистрация: 13.12.2015
Сообщений: 995
29.04.2016, 20:14 #2
попробуйте через socket - тема рядом. можно сразу на онкрейт запускать
после загрузки меняете содержимое или новый активити вызываете.
0
smwed
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 8
29.04.2016, 20:18  [ТС] #3
Я уже думал о сокетах, но мне кажется вопрос не в методике передачи данных, а в принципе в архитектуре - я понимаю, что не правильно запускать процесс авторизации в onCreate напрямую, ибо активити даже не отрисовывается тогда. Точнее авторизацию надо запускать именно в onCreate, но видимо в отдельном потоке, а результат отлавливать отдельно вообще.. .видимо через handler как-то... вот и не могу пока сообразить как правильно всё организовать..
0
Alexvp
111 / 75 / 8
Регистрация: 03.08.2014
Сообщений: 390
29.04.2016, 20:52 #4
Запустите создание активити, потом включите какую-нибудь анимацию, даже обычный индикатор загрузки, выведите пользователю подсказку, типа "идет запрос на сервер...". После этого посылайте свой запрос на сервер и обрабатываете ответ. Конечно, запрос на сервер и обработка ответа должна идти как минимум в асинктаске.
0
smwed
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 8
29.04.2016, 20:54  [ТС] #5
Alexvp, дык не выводится ничего, из-за того, что авторизация идет в onCreate и еще не отрисован даже основной лайоут... Пытался вывести ProgressDialog.... ничего
0
Alexvp
111 / 75 / 8
Регистрация: 03.08.2014
Сообщений: 390
29.04.2016, 20:58 #6
Так сначала отрисуйте лайоут, в нем выведите индикатор, а потом посылайте запрос.

Добавлено через 1 минуту
Поставьте себя на место пользователя. Вы долго будете ждать старта приложения? Поэтому вначале надо что-то показать пользователю, а потом делать скрытый процесс.
0
smwed
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 8
29.04.2016, 20:59  [ТС] #7
Вот код:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

appSettings = PreferenceManager.getDefaultSharedPreferences(this);

setContentView(R.layout.main);

..сразу после этого выводился ProgressDialog и запускался процесс авторизации. (к сожалению уже переделал код)

Так при старте был просто белый экран до окончания процесса авторизации

Добавлено через 33 секунды
и только после процесса авторизации показывался диалог с прогрессом...
0
Alexvp
111 / 75 / 8
Регистрация: 03.08.2014
Сообщений: 390
29.04.2016, 21:01 #8
Цитата Сообщение от smwed Посмотреть сообщение
только после процесса авторизации показывался диалог с прогрессом
Концептуально неверно. Если пользователь запустил приложение, то он ожидает что-то увидеть. Для этого прогрессбар и придуман.
0
smwed
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 8
29.04.2016, 21:03  [ТС] #9
Так я и пишу же: сначала я пытался вывести прогрессбар, и только потом запускал процесс авторизации.. а в результате получал при старте приложения белый экран, который висел до конца процесса авторизации и только затем показывался прогрессбар и сам основной лайоут.. Я и пытаюсь с этим бороться!
0
SergioO
168 / 184 / 90
Регистрация: 13.12.2015
Сообщений: 995
29.04.2016, 21:09 #10
Цитата Сообщение от smwed Посмотреть сообщение
Я уже думал о сокетах, но мне кажется вопрос не в методике передачи данных, а в принципе в архитектуре - я понимаю, что не правильно запускать процесс авторизации в onCreate напрямую, ибо активити даже не отрисовывается тогда. Точнее авторизацию надо запускать именно в onCreate, но видимо в отдельном потоке, а результат отлавливать отдельно вообще.. .видимо через handler как-то... вот и не могу пока сообразить как правильно всё организовать..
работа с сокетом никак не зависит от прорисовки активити.
те грузите приветствие - активити намбер ван(параллельно, но асинхронно работает сокет у которого есть таймаут, например 2 сек), если сокет авторизуется, то грузится активити намбер ван, если таймаут, то окошко регистрации.
и сокет и програссбар запускайте, когда все прорисуется так красивее будет.
0
Alexvp
111 / 75 / 8
Регистрация: 03.08.2014
Сообщений: 390
29.04.2016, 21:09 #11
Цитата Сообщение от smwed Посмотреть сообщение
Так я и пишу же
Дорогой, я уже третий раз вам толкую. Чтобы вместо белого экрана пользователь что-то видел, то ему это надо показать. Процесс запроса на сервер обычно требует с десяток секунд. Примерно столько висит ваш белый экран. Бороться с этим бесполезно, так как приложение ожидает ответа от сервера для определения дальнейших шагов. Поэтому, если вас раздражает пустой экран (он и пользователя будет раздражать), то перед запросом на сервер покажите что-то на экране.
0
SergioO
168 / 184 / 90
Регистрация: 13.12.2015
Сообщений: 995
29.04.2016, 21:15 #12
Цитата Сообщение от Alexvp Посмотреть сообщение
сервер обычно требует с десяток секунд
что это за сервера такие лютые, которые авторизуют за 10 секунд? таймаута в 2 сек более чем достаточно, ну 5... и то никуда не годится
0
Alexvp
111 / 75 / 8
Регистрация: 03.08.2014
Сообщений: 390
29.04.2016, 21:27 #13
SergioO,
Дело не только в самом сервере, но и в каналах связи. Для своих приложений я закладываю максимальный тайм-аут порядка 15 секунд. Хотя обычно хватает 1-3 сек.
P.S. Для целей безопасности, защита от подбора паролей, на сервере я делаю принудительный тайм-аут в 2 секунды. Это плюс к обычной задержке.
0
smwed
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 8
29.04.2016, 21:31  [ТС] #14
Так. Давайте по-порядку... Мух от котлет..

В какой момент надо запустить процесс авторизации если не в onCreate ?
Если я его запускаю в онкрейт, то активити не отрисовывается до окончания процесса, не смотря на то, что процесс запускается последней строкой в онкрейт
0
Alexvp
111 / 75 / 8
Регистрация: 03.08.2014
Сообщений: 390
29.04.2016, 21:39 #15
Примерно так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.load);
    ProgressBar ProgressBar = (ProgressBar)findViewById(R.id.progressBar);
    ProgressBar.setVisibility(View.VISIBLE);
    TextView loadServer = (TextView)findViewById(R.id.textViewLoad1);
    loadServer.setText(R.string.connecting);
        sPref = getSharedPreferences(Const.APP_PREFERENCES, Context.MODE_PRIVATE);
        login = sPref.getString(Const.APP_PREFERENCES_LOGIN, "");
        passwd = sPref.getString(Const.APP_PREFERENCES_PASSWD, "");
 
        ServerTaskAutoLogin taskLoginLoad = new ServerTaskAutoLogin();
        taskLoginLoad.execute(new String[]{"url"});
       
    }
ServerTaskAutoLogin это асинктаск
0
SergioO
168 / 184 / 90
Регистрация: 13.12.2015
Сообщений: 995
29.04.2016, 21:45 #16
у меня активити отработало за 2,48 секунды. притом что там циклически еще по странице пробежала и плюсовала строки + параллельно в консоль писала и тд.
0
smwed
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 8
29.04.2016, 21:49  [ТС] #17
Alexvp, прогрессбар на лайоуте лежит? а я всплывающим окном с крутилкой пытался.. оно вообще не показывается до окончания авторизации
0
Alexvp
111 / 75 / 8
Регистрация: 03.08.2014
Сообщений: 390
29.04.2016, 21:52 #18
Цитата Сообщение от smwed Посмотреть сообщение
а я всплывающим окном с крутилкой пытался
Может быть я невнимательно читал тему, но этот момент не увидел. Честно говоря как верно сделать в вашем случае не знаю. Никогда не пробовал.
0
SergioO
168 / 184 / 90
Регистрация: 13.12.2015
Сообщений: 995
29.04.2016, 22:01 #19
smwed, вы можете данные предоставить или просто какую страницу прогружать?
давайте я попробую через сокеты сделать. какой API ?
0
smwed
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 8
29.04.2016, 22:05  [ТС] #20
А в onCreate можно отменить создание и вернуться на вызвавший код?

Это я к тому, что может в Main открывать активити с логином/паролем,а в ней при открытии делать авторизацию если есть сохраненные логин/пароль. И в случае успешной авторизации даже не показывать лайоут, а сразу закрывать ?

Добавлено через 2 минуты
SergioO, спасибо, конечно, но не вижу смысла, так как в дальнейшем приложение должно активно работать с сервером - получать с него разные данные в xml, а реализацию этого я планирую на HttpURLConnection построить..

Добавлено через 44 секунды
Просто логика построение приложения на андроиде (все эти активити и их onCreate, onStop и т.д.) для меня нова... изучаю потихоньку..
0
29.04.2016, 22:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2016, 22:05

Управление Рабочей областью пользователя. Нужен совет.
Добрый день!Нужен совет! Необходимо добавить всем пользователем Lotus новый...

Структура приложения(нужен совет)
Пишу код программы и возник вопрос: нужно ли использовать полиморфизм в...

Нужен совет в проектировании приложения
Добрый день. Много лет программировал в delphi + СУБД (firebird, oracle)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru