|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
Привет всем! подскажите пожалуйста, подключаюсь на входной форме к серверу mySQL, ввожу логин и пароль. Это в форме MainActivity. Для подключения к серверу написал отдельный простенький класс с jdbc расширенный с AsynkTask, чтобы процесс подключения шел на заднем фоне. Все отлично отрабатывает, соединение при правильном логине и пароле устанавливается и тестовый запрос проходит отлично. Вот класс: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.
В MainActivity тоже все просто и прозрачно: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
Главный вопрос топика, как проверить соединение после введения логина и пароля. 1) если пароль /логин введен верно, то переход на другую активность 2) если неверно, то обработать его в виде Toast на MainActivity (как то нужно проверить исключение, не осилил пока.) Прошу по возможности отвечать в рамках приведенного кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2019, 00:34 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
Сергей Лалов Код: java 1. 2. 3. 4.
Этот код и так выполняется в основном потоке. Можно напрямую обратиться к главной активности. Но я-бы из него дернул UI поток главной активити с результатом подключения через сообщения: https://www.google.ru/search?q=android main activity looper Да, "дорого", но правильно. Но и первый вариант тоже рабочий. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2019, 08:36 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
wadmanСергей Лалов Код: java 1. 2. 3. 4.
Этот код и так выполняется в основном потоке. Можно напрямую обратиться к главной активности. Но я-бы из него дернул UI поток главной активити с результатом подключения через сообщения: https://www.google.ru/search?q=android main activity looper Да, "дорого", но правильно. Но и первый вариант тоже рабочий. Спасибо за наводку, помогло! 1) Реализовал возврат булевого значения в методе doInBackground. Если процедура подключения прошла, то return true. Если не прошла , соответственно false. В качестве дополнительного аргумента, добавил в конструктор класса переменную context, чтобы можно было в onPostExecute выполнять контекст в разрезе метода main входной формы. Обращение на стороне Main немного изменилось : .... new SqlConnection(login.getText().toString(), password.getText().toString(),this).execute(); .... На стороне AsyncTask изменил тип возвращаемого значения у одного из методов, и добавил туда также обработку Context: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.
C Toast все отлично отрабатывает, а вот с intent тяжеловато. Падает приложение. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2019, 20:32 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
Сергей Лалов Падает приложение. потому что ты приводишь тип контекст к ActivityTwo, а он на самом деле MainActivity ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2019, 21:35 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
chpashaСергей Лалов Падает приложение. потому что ты приводишь тип контекст к ActivityTwo, а он на самом деле MainActivity Я познакомился с Intent и Context практически в момент написания этого кода.)) Поправил, спасибо!, все пошло: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Есть пару утилитарных вопросов, связанных с обработкой соединений, закрытием активностей и хранений соединений . 1) Нормально ли хранить текущее соединение в глобальной переменной,или лучше при успешном входе/исполнении процедуры закрывать соединение и просто хранить успешную строку подключения как текстовую переменную в каком нибудь отдельном классе? И потом при необходимости выполнить какое либо действие выполнять повторное подключение с попыткой выполнить к примеру CRUD. 2) Что лучше при переходе с активити на активити- закрывать принудительно типа .closeActivity(); ? С формой входа/регистрации все ясно, можно принудительно закрывать, так как при успешном входе на нее больше возвращаться не надо, а вот с активити, которые составляют основной рабочий функционал? Какие основные особенности у активити, которая просто уходит в спящий режим? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 17:54 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
Сергей ЛаловНормально ли хранить текущее соединение в глобальной переменной у каждого варианта свои недостатки. с одной стороны установка соединения - дорогостоящая операция и ее нужно делать как можно реже. с другой стороны телефон может уходить в сон и коннект может протухнуть, т.е. при постоянно висящем коннекте придется еще его проверять на валидность. кроме того база может иметь ограничения по кол-ву одновременно висящих коннектов. так что я бы выбрал вариант устанавливать соединение когда нужно и обрывать после получения данных. А вообще, как я уже писал в другом топике, всю идею с коннектом на клиенте я нахожу ущербной. Сергей Лалова вот с активити, которые составляют основной рабочий функционал? зависит от того, много ли ресурсов они потребляют (загружают ли например картинки, какие-то блобы и т.п.). В целом это не вопрос жизни и смерти. Можно начать их закрывать сразу, а в запущенной активити реализовывать возврат к предыдущей. А можно не заниматься преждевременной оптимизацией - возможно пара висящих в бэкстэке активити никаких проблем не создадут. Главное чтоб user experience был сохранен, т.е. нажав "назад" на Activity-B пользователь должен оказаться в Activitiy-A. Покуда это происходит и введенные данные никуда не пропали, все равно как ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 18:49 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
По сравнению с прошлой задачей изучил поверхностно RecycleView и сделал простую реализацию вывода списка фиксированных значений в этот список. Потестировал в отдельно созданном проекте, все работает, код в main отрабатывает отлично. Решил интегрировать данный список в текущий проект, чтобы при переходе с формы аутентификации (Main Activity) во вторую форму (SecondActivity) при открытии этой второй активити генерился данный список. Повторил абсолютно все действия из отдельного проекта с работающим RecicleView, но приложение вылетает. Вот код в SecondActivity, он простой: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Класс где собирается RecicleView тоже упрощен: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64.
Если эти два кода запускать в отдельном проекте , все работает. При загрузке к примеру в MainActivity в отдельном проекте все работает отлично. А вот при переносе из этого отдельного проекта в действующий возникла проблема, что когда запускается переход с формы аутентификации на вторую активити приложение вылетает. (Я все добавил, не забыл отдельный файл xml для макета строки в recycleView. Элемент этот также присутствует в библиотеках проекта и загружен). Асинхронность тут тоже не причем как понимаю, так как построение recycleView идет в теле onCreate (Все отрабатывало в отдельном тестовом проекте примере). Переход из первую активити во вторую осуществляется так, из асинхронного запроса : Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Ссылок во второй активити на тяжелые элементы типа Connection нет, ничего такого. Не понимаю причин вылета, может экземпляр какой то не тот открывается, не могу отловить ошибку. Логи тоже не помогают ,не могу понять где ошибка: 2019-06-28 18:58:37.379 5541-5541/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.myapplication, PID: 5541 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.SecondActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setLayoutManager(androidx.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3260) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3396) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2009) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7319) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setLayoutManager(androidx.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference at com.example.myapplication.SecondActivity.onCreate( SecondActivity.java:27 ) at android.app.Activity.performCreate(Activity.java:7783) at android.app.Activity.performCreate(Activity.java:7772) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3235) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3396) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2009) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7319) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 19:36 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
А, все, разобрался. Ошибка типа копипаст, все работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 19:41 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
Сергей ЛаловА, все, разобрался. Ошибка типа копипаст, все работает. вообще-то по ошибке отлично видно что не так java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setLayoutManager(androidx.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference твой recyclerview в момент обращения к setLayoutManager - null, т.е. он не нашелся в предущей строчке по findViewById(R.id.rvAnimals) в AndroidStudio и в IDEA есть Analyze -> Analyze Stack trace - вставляешь ошибку целиком и можно перейти прямиком на строку с ошибкой. Впрочем если само сообщение не понятно, это может не помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 13:13 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
chpasha, Спасибо! В принципе в logcate тоже можно настроить фильтрацию по типу ошибок и перейти при необходимости на больную строку. В данном случае nullpointexeption это уже как следствие другой ошибки. Копипастнул, не заметил что recycleview выводиться то собственно должен на secondActyvity , а при копировании вывод так и остался на mainActivity из моего тестового примера. Как результат - два часа убито на поиск одной неправильно указанной переменной)) зато с логами научился разбираться немного. Немного по теме топика, не по основному вопросу : протестировал соединение как через jdbc так и через http. Субъективно, что так, что этак время соединения /пинга одинаковое. При краше соединения , что так что этак приходиться обновлять соединение и осуществлять повторно соединение. По времени столько же ,геммор сопоставим по времени. В jdbc после подключения оно как бы засыпает и ждёт следующего обращения, батарея минимально напрягается. Не знаю, видимо все таки jdbc ,не любят именно в силу прямого небезопасного соединения , хотя это тоже условно. Ломают то в основном как раз по 80 порту сайты и хосты , использующие классические http запросы. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 21:12 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
Сергей Лаловгеммор сопоставим по времени это не так. http делается намного проще в силу того, что это типичная задача для андроид. например так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
с jdbc так же элегантно ты не напишешь еще очень долго, а может даже никогда. работают ли на андроид (и как работают) обычные для явы orm/аctiverecord фреймворки - большой вопрос. Сергей ЛаловНе знаю, видимо все таки jdbc ,не любят именно в силу прямого небезопасного соединенияне только. еще из-за того, что у тебя апп становится зависим от совершенно конкретной реализации бэкенда (т.е. базы mysql, я уже не говорю про то, что нужна будет дьявольская дисциплина и планирование, чтобы никакие изменения в БД тут же не поломали все клиенты разом), а совместимость jdbc драйвера с любым устройством в дикой природе остается под большим вопросом. Так же под вопросом работа приложения внутри корпоративной сети, где могут быть закрыты все порты кроме стандартных. На мой взгляд масса недостатков и только одно преимущество - не надо писать backend. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2019, 15:06 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
chpasha...... еще из-за того, что у тебя апп становится зависим от совершенно конкретной реализации бэкенда (т.е. базы mysql, я уже не говорю про то, что нужна будет дьявольская дисциплина и планирование, чтобы никакие изменения в БД тут же не поломали все клиенты разом), а совместимость jdbc драйвера с любым устройством в дикой природе остается под большим вопросом. Так же под вопросом работа приложения внутри корпоративной сети, где могут быть закрыты все порты кроме стандартных. На мой взгляд масса недостатков и только одно преимущество - не надо писать backend. Немного знаю PHP , написать страничку аутентификации с вводом логина и пароля смогу)) Ну и вывести данные в формате Json в качестве response тоже смогу. Но сейчас все обросло фреймворками, примеры жесткие в сети. Вот к примеру вывести JSON в RecycleView пока для меня вообще жесть. Как кэшировать это все на стороне клиента и как этот кэш ведет себя, когда приложение неактивно в фоновом режиме, итд итп..жестко. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2019, 19:19 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
Сергей ЛаловНо сейчас все обросло фреймворками, примеры жесткие в сети обычно с frameowork-ами как в том мультике про "крылья ноги и хвосты". сначала теряешь день, но зато потом долетаешь быстрее и надежнее Сергей ЛаловВот к примеру вывести JSON в RecycleView выводить нужно объекты, полученные из json - ява типизированный язык и нужно этом пользоваться. а так да, концепция RecyclerView слегка зубодробительная для новичка. Мягко выражаясь. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:27 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
chpashaСергей ЛаловНо сейчас все обросло фреймворками, примеры жесткие в сети обычно с frameowork-ами как в том мультике про "крылья ноги и хвосты". сначала теряешь день, но зато потом долетаешь быстрее и надежнее А что лучше по вашему мнению Retrofit или Volley? Копать сразу два просто времени нет, сначала какой нибудь один, попроще и ближе к человеку) chpashaвыводить нужно объекты, полученные из json - ява типизированный язык и нужно этом пользоваться. а так да, концепция RecyclerView слегка зубодробительная для новичка. Мягко выражаясь. Концепция сборки вью да, сколько примеров в сети, и везде разный подход)) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 17:11 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
Сергей ЛаловА что лучше по вашему мнению Retrofit или Volley? я бы взял retrofit - это гораздо более высокоуровневая и простая в использовании либа. Volley - очередной гугловский высер, с тоннами кода на каждый чих. Да и разбираться с retrofit нефиг делать - после просмотра примеров уже на 90% все понятно. Остаются только всякие мелочи типа кастомной сериализации, авторизации и пр., которые не факт что понадобятся. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 17:50 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
chpasha, Спасибо! Погрузился в Retrofit. Курю понемногу вторые сутки, нашел пару рабочих примеров под ключ. Надо отдать должное индусам, нация программистов, можно найти код именно под свое восприятие )) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2019, 16:14 |
|
проверка connection, обработка исключений в asyncTask
|
|||
---|---|---|---|
#18+
у меня похожий вопрос. использую в работе MS SQL базу. Подключение к ней реализовано в классе AsyncTask (использовал jtdc драйвер) главного Activity. После успешного подключения из главного Activity могу делать запросы к таблицам через этот открытый connection. Сам connection закрываю в методе OnDestroy(). Планирую во время работы приложения держать этот connection открытым, чтобы не переподключаться к базе данных. Но вот как мне обратиться к открытому connection из другого Activity (используя этот самый открытый connection)? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 17:35 |
|
|
start [/forum/topic.php?fid=3&gotonew=1&tid=1143711]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
34ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 11184ms |
total: | 11356ms |
0 / 0 |