Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991

Поймать статус соединения с сервером и перейти в другую активити

24.06.2019, 21:50. Показов 1112. Ответов 6

Студворк — интернет-сервис помощи студентам
Привет всем! подскажите пожалуйста, подключаюсь на входной форме к серверу 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
39
40
41
42
43
44
import android.os.AsyncTask;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
 
public class SqlConn extends AsyncTask<Void,Void,Void> {
 
    SqlConn(String user,String pass ){
        this.user=user;
        this.pass=pass;
    }
    public  static Connection activeCon=null;
    public  static Statement activeSt=null;
    public  static ResultSet activeRs=null;
 
 
 
 
    private static final String url = "jdbc:mysql://localhost:3306/test_db?serverTimezone=Europe/Moscow&useSSL=false";
    private  static   String user;
    private  static  String pass ;
    @Override
    protected Void doInBackground(Void... voids) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
             activeCon = DriverManager.getConnection(url, user, pass);
            activeSt = activeCon.createStatement();
             activeRs = activeSt.executeQuery("SELECT 1");
 
        } catch (Exception e) {
 
            e.printStackTrace();
        }
return null;
    }
 
    @Override
    protected void onPostExecute(Void aVoid) {
// TODO: что то написать для проверки, но чтобы хватать в MainActivity
        super.onPostExecute(aVoid);
    }
 
}


В 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
public class MainActivity extends AppCompatActivity {
TextView textView;
    Button btn1;
EditText login;
EditText password;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.tv1);
        btn1 = (Button) findViewById(R.id.button);
        login =(EditText) findViewById(R.id.fld_login);
        password =(EditText) findViewById(R.id.fld_password);
        btn1.setOnClickListener(view -> {
 
            if (TextUtils.isEmpty(login.getText())||TextUtils.isEmpty(password.getText())){ //здесь все работает отлично
 
               Toast tst= Toast.makeText(getApplicationContext(),"Заполните для входа все поля!",Toast.LENGTH_SHORT);
                tst.setGravity(0,0, 0);
                tst.show();
 
            }
else {
                try {
 
                    // пробуем подключаться к серверу
                    if (SqlConn.activeCon == null || SqlConn.activeCon.isClosed()) {
                       new SqlConn(login.getText().toString(), password.getText().toString()).execute();
 
                      // КАК ПРОВЕРИТЬ УСПЕШНОСТЬ ПОДКЛЮЧЕНИЯ И ЕСЛИ ОНО УСПЕШНО ПЕРЕЙТИ В СЛЕДУЮЩУЮ АКТИВНОСТЬ. ПРОБЛЕМА С ПРОВЕРКОЙ
                        // ПОДКЛЮЧЕНИЯ. КАК ОТЛОВИТЬ НЕПРАВИЛЬНО ВВЕДЕННЫЙ ЛОГИН ИЛИ ПАРОЛЬ????
                      }
                    else{
                        Toast.makeText(getApplicationContext(),"вы ввели неверный логин или пароль",Toast.LENGTH_SHORT).show();
                    }
 
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}



Главный вопрос топика, как проверить соединение после введения логина и пароля.


1) если пароль /логин введен верно, то переход на другую активность
2) если неверно, то обработать его в виде Toast на MainActivity


Прошу отвечать в рамках приведенного кода, очень поможете, код очень простенький, но засел с проверкой на день уже.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2019, 21:50
Ответы с готовыми решениями:

Как перейти в другую активити при нажатии на RecycleView во фрагменте
У меня есть фрагмент, который помещён во вкладках. Во фрагменте есть RecyclerView и при нажатии на него нужно переходить в активити....

Переход из фрагмента одной активити в другую активити
Как реализовать нажатие на кнопку чтобы из фрагмента одной активити попасть в другую активити?

Ошибка соединения с сервером
Добрый вечер. Подскажите, пожалуйста что за ошибка такая. ЗАГОЛОВОК: Соединение с сервером ------------------------------ Не...

6
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
25.06.2019, 00:56
SqlConn.activeCon в другом потоке. Не в main.
В Activity из AsyncTask doInBackground ничего не получить иначе как через колбэки.

И вообще, во всех туториалах и учебниках написано, что AsyncTask так не надо использовать. Потому, что изменение конфигурации(переворот экрана и подобное) убивает активити и создает новое, на которые у AsyncTask нет ссылок. И вся работа уходит в пустую.
0
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
25.06.2019, 01:06  [ТС]
SqlConn.activeCon в другом потоке. Не в main.
в примере он и так выполняется в отдельном потоке. В классе SqlConnect, расширенным AsyncTask, в методе doInbackground.

В Activity из AsyncTask ничего не получить иначе как через колбэки.
Так суть вопроса в том и заключается как вернуть статус соединения обратно в Main из AsyncTask, чтобы его обработать и если подключение успешно ,то перейти на другую активность, а если не успешно то выбросить Toast.

И поворот экрана у меня тоже выключен.
0
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
25.06.2019, 01:24
Цитата Сообщение от Сергей1980 Посмотреть сообщение
в примере он и так выполняется в отдельном потоке. В классе SqlConnect, расширенным AsyncTask, в методе doInbackground.
Именно поэтому из него ничего нельзя получить напрямую SqlConn.activeCon. Это другой поток.

Цитата Сообщение от Сергей1980 Посмотреть сообщение
Так суть вопроса в том и заключается как вернуть статус соединения обратно в Main из AsyncTask
Через колбэк onPostExecute. Но это не то, чего Вы хотите.
Потому, что после окончания doInBackground все Ваши SqlConn.activeCon уберутся сборщиком мусора.
Запускаться AsyncTask должен не из Активити, а из такого класса, которому изменения конфигурации приложения пофигу. Он запущен всегда. Типа LiveModel.

Цитата Сообщение от Сергей1980 Посмотреть сообщение
И поворот экрана у меня тоже выключен.
Это не важно. Поворот экрана - это один из миллионов возможно "изменений конфигурации". Всех не поодключаете.
И даже, если поодключаете, то это за собой потянет другие проблемы. Потому что так работает андрод. Активити убивается и создается новое. Как запретить Солнцу заходить за горизонт и выходить из-за него. Остановить-то можно. Но это будет катастрофа для планеты.
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
25.06.2019, 01:35  [ТС]
-----
И вообще, во всех туториалах и учебниках написано, что AsyncTask так не надо использовать. Потому, что изменение конфигурации(переворот экрана и подобное) убивает активити и создает новое, на которые у AsyncTask нет ссылок. И вся работа уходит в пустую.
-----


Даже детально поясню что это фигня, не поленюсь: я создал отдельный класс, которому пофигу на состояние поворота экрана, он не связан с UI, так как его с ним почти ничего не связывает. Его только связывает прием двух переменных - логина и пароля оттуда. (Если даже был бы случайный поворот экрана и поля очистились, и я бы случайно нажал на Войти, то эта ситуация уже предусмотрена в коде Main. Если поля пустые, то процедура запроса к MySql вообще не выполняется. Это все написано в моем первоначальном примере кода Main. Всех трех с половиной строчек кода)

В общем ваш ответ не несет никакой практической ценности.


Поясню почему, прошу не обижаться. Потому что если пароль и логин введен верно то соединение существует. И я могу к нему обращатся, и выполнять запросы)
0
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
25.06.2019, 04:39
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Потому что если пароль и логин введен верно то соединение существует. И я могу к нему обращатся, и выполнять запросы)
Тут Вы ошибаетесь. Вы можете обращаться к соединению только в doInBackground. Там, где открыли. В другом потоке.
Взаимодействие с Активити из АсинкТаск производится только через колбэки.
Вот в них и обрабатывайте результаты подключения к базе.

Иначе бы зачем были бы нужны колбэки, если можно обращаться из МэйнАктивити к, например, AсинкТаскКлас.Коннект?

Обрабатывайте ResultSet activeRs не в произвольном месте в MainAcrivity, а в onCancelled(), в onPostExecute() и т.д...
Но опять же. Вы ж хотите соединение передавать через из АсинкТаск в Активити и дальше в другое Активити.
Вот этого сделать нельзя. Делайте все с базой в doInBackground. Открыли, запрос, получили результат и закрыли.

Добавлено через 1 минуту
И да. Это все не имеет практического смысла. Но не мой ответ, а Ваш вопрос.

Добавлено через 2 минуты
С mysql из Android'a напрямую никто не работает. Только через web прокладку. Короткими запросами.

Добавлено через 11 минут
В том месте где Вы пишете
// КАК ПРОВЕРИТЬ УСПЕШНОСТЬ ПОДКЛЮЧЕНИЯ И ЕСЛИ ОНО УСПЕШНО ПЕРЕЙТИ В СЛЕДУЮЩУЮ АКТИВНОСТЬ. ПРОБЛЕМА С ПРОВЕРКОЙ
// ПОДКЛЮЧЕНИЯ. КАК ОТЛОВИТЬ НЕПРАВИЛЬНО ВВЕДЕННЫЙ ЛОГИН ИЛИ ПАРОЛЬ????

нельзя "ПРОВЕРИТЬ УСПЕШНОСТЬ ПОДКЛЮЧЕНИЯ "
Потому, что после SqlConn.execute() этот екзекют будет еще 10 минут исполняться. А Вы уже точку проверки проскочили.
То есть она заведомо будет false в любом случае.

Проверяйте в doInBackground и передавайте в onPostExecute() который и будет уже открывать новую активити или запрашивать пароль.

Но это все равно неправильно. Не надо AcинкТаск из Активити вызывать.
Вообще Активити только для отображения изображения экрана.
Никакой другой логики в нем быть не должно.

И да, нет практического смысла в ответе на вопрос, который вообще смысла не имеет.

Добавлено через 52 секунды
Просто азбучные истины. Может кому-то будет интересно. Топикстартеру это не интересно.
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
25.06.2019, 06:46  [ТС]
Да нет, спасибо, внимательно прочитал., За проведенную работу с азбукой отдельное спасибо!)

Только осваиваю android и java. Понимаю что модель android+jdbc+mysql не рекомендованная практика. И то что точечные запросы к веб серверу наиболее предпочтительны.
Использовал до этого очень долго связку десктоп Odbc на другом языке. Соединение почти никогда не крашилось, единичные случаи.
Поэтому начал реализацию проектика с того, что знаю и умею.

С позиции безопасности на все сто процентов согласен, дырка на 3306 напрямую смотрится странно. Это конечно проблема, но за 6 лет моя бд никому не нужна была с позиции взлома) Да в случае взлома там бы ждало пару нервных сюрпризов.

По скорости точечных запросов открыл/закрыл тут наверное паритет с вэб. Я параллельно мониторил на стороне mysql, даже при Е с 2 палками, зависало примерно на 1,5 сек всего. Зато взамен можно получить уже RowSet , причем стоковый, который сам кэшируется , при отваливании из сети хранит значения, и при следующем Коннект/реконнект синхронизируется с бд сам.

Видимо в большей степени методика работы по http цениться из за того что модель доступа к данным в виде Json упрощает разработку параллельно коллегам ,пишущих веб интерфейс , легче поддерживать соединение при помощи сессий , и кэшировать результат для быстрой выдаче можно собственно на вэбсервере. итд итп.

Php знаю немного, можете по CRUD какие нибудь толковые ссылки кинуть, как андроид использовать с веб запросами. ? С лаконичным кодом на стороне сервера.

В любом случае спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2019, 06:46
Помогаю со студенческими работами здесь

Ошибка соединения с сервером
Решил создать сайт на движке Wordpress, зарегистрировал домен и хостинг, выгрузил движок на сервер, и при заходе на сайт писало удалите...

Проверка соединения с сервером
Доброго всем здоровьица. (C#) В программе существует два потока: один посылает данные на сервер, а другой принимает. Как только сервер...

Ошибка соединения с сервером
Привет! Я купил себе недорогой хостинг и спросил у т.п. выдержит ли он 1000-2000 запросов в минуту и мне ответили что выдержит. В итоге...

Нет соединения с сервером
у меня следующая проблема. на моём компе клиент спокойно подключается и по локальному ip, и по интернет ip к серверу. всё работает, как...

Ошибки соединения c сервером
Проблема вот в чем, переодически пропадает соединение с mysql сервером, настроена односторонняя репликация, данный сервер slave. логи вот...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru