С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
#1

Ожидание подключения wifi - Программирование Android

30.03.2013, 13:03. Просмотров 2869. Ответов 16
Метки нет (Все метки)

Включаю wifi и пытаюсь дождаться подключения.
Идея следующая
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
final class ConnectivityReceiver extends BroadcastReceiver
{
    private final int m_ntype;    
    private final CountDownLatch m_receive = new CountDownLatch(1);
 
    ConnectivityReceiver(int type)
    {
        m_ntype = type;
    }
 
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Bundle bundle  = intent.getExtras();
        if (bundle == null)
        {
            Log.e(this.getClass().getName(), "Отсутствуют данные SMS");
            return;
        }            
        NetworkInfo ninfo = bundle.getParcelable(ConnectivityManager.EXTRA_NETWORK_INFO);
        if (ninfo == null)
        {
            Log.e(this.getClass().getName(), "Отсутствуют данные о сети");
            return;            
        }
        if ((ninfo.getType() == m_ntype) && (ninfo.getState() == State.CONNECTED))
        {
            m_receive.countDown();
        }
    }
 
    public boolean waitForConnection() throws InterruptedException
    {
        return m_receive.await(30, TimeUnit.SECONDS);
    }
}
Использую так
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
    private boolean wifiConnect()
    {
        ConnectivityReceiver receiver = new ConnectivityReceiver(ConnectivityManager.TYPE_WIFI);
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);                    
        m_context.registerReceiver(receiver, filter);
 
        try
        {        
            Log.d(this.getClass().getName(), "Включение wifi");
            if (!m_wmanager.setWifiEnabled(true))
            {
                Log.e(this.getClass().getName(), "Ошибка включения wifi");
                return false;                                    
            }
            if (!receiver.waitForConnection())
            {
                Log.e(this.getClass().getName(), "Не удалось подключиться к сети");
                return false;                                                            
            }
 
            Log.d(this.getClass().getName(), "Подключились к wifi");
            return true;
        }
        catch (Exception ex)
        {
            String error = (ex.getMessage() != null)
                ? ex.getMessage() : "Ошибка включения WiFi";            
            Log.e(this.getClass().getName(), error);
            return false;            
        }
        finally
        {
            m_context.unregisterReceiver(receiver);
        }
    }
Но не всегда удается дождаться.
Складывается впечатление, что BroadcastReceiver приходит в том же потоке.

Как еще можно дождаться ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2013, 13:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ожидание подключения wifi (Программирование Android):

Ожидание подключения к серверу (ProgressDialog) - Программирование Android
Здравствуйте! Мне нужно, чтобы при переходе на MainActivity вылазил ProgressDialog (он проверяет есть ли подключение к серверу), если...

Ожидание завершения AsyncTask - Программирование Android
Имеется класс "расширяющий" AsyncTask. Как я понимаю при создании объекта этого класса создается новый поток который выполняется...

Ожидание завершения пула потоков - Программирование Android
Нужно чтоб результат этого кода возвращался по завершению выполнения всех потоков в пуле ExecutorService exService =...

Ожидание ответа от запроса к серверу по сети - Программирование Android
Всего доброго! Использую Volley для получения ответа от сервера, мне нужно чтобы при нажатии на кнопку выполнялся запрос и ответ на...

Ошибка подключения по wifi - Wi-Fi
Столкнулся с такой интересной проблемой ,для меня во всяком случае, на работе в ноутбуке ввожу ключ безопасности (пароль) wifi, пишет, что...

Пробоема подключения к Wifi - Сети
Подскажите пожалуйста возникла такая проблема есть вайфай у соседа незапароленный раньше подключался к нему нормально пользовался но один...

16
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
02.04.2013, 11:54  [ТС] #2
Никто не делал ?
0
lifestyle
Mobile Developer
232 / 228 / 4
Регистрация: 10.05.2009
Сообщений: 917
03.04.2013, 01:27 #3
попробуй receiver.waitForConnection() вынести в отедльный поток или в asyncTask... или вообще без него проверь если броадкаст ловится вообще

Добавлено через 49 секунд
вообще работать с сетью нужно в отдельном потоке....
0
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
03.04.2013, 14:03  [ТС] #4
Так это все и выполняется в отдельном потоке. Или я чего-то не понял ?
0
lifestyle
Mobile Developer
232 / 228 / 4
Регистрация: 10.05.2009
Сообщений: 917
04.04.2013, 00:27 #5
я тут отдельного потока вроде бы не видел))))
0
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
04.04.2013, 10:22  [ТС] #6
Цитата Сообщение от lifestyle Посмотреть сообщение
я тут отдельного потока вроде бы не видел))))
Я просто не совсем понимаю как вынести в отдельный поток. Ведь если я его запущу, то мне все-равно придется
ждать его завершения, чтоб понять, что подключение активно.
Выносить логичнее само включение wifi, то есть setWifiEnabled.

Или как-то asyncTask решит эту проблему ?
0
lifestyle
Mobile Developer
232 / 228 / 4
Регистрация: 10.05.2009
Сообщений: 917
06.04.2013, 01:16 #7
Ну а так ты в основном потоке ждешь выполнения функций, и в это время весь твой UI "заморожен" ...
Или я наверное, что то не так понимаю.
Какого функционала ты добиваешься??
вынеси в отдельный поток а лучше через AsyncTask весь метод wifiConnect() да и наверное увеличь тайм аут, иногда подключение занимает приличное время...
метод waitForConnection() заморажевает главный поток на 30 секунд , в это время ничего не может быть выполнен, т.е. заходишь в метод waitForConnection() основной поток засыпает, соответственно ничего не происходит и через 30 секунд метод wificonnect() завершается со значением FALSE и соответственно удаляется ресивер данного бродкаста...
0
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
06.04.2013, 12:18  [ТС] #8
Понятно. Идею понял.
Только стою перед делемой- создать поток или
использовать AsyncTask. Нужно, чтобы задача
выполнялась регулярно каждые 10-15 мин., но
не в потоке gui, чтоб его не блокировать.

Я просто с AsynkTask не работал.
Подойдет ли он для этого?
И где можно найти примерчик работы с ним?
0
lifestyle
Mobile Developer
232 / 228 / 4
Регистрация: 10.05.2009
Сообщений: 917
06.04.2013, 14:19 #9
xbarmaglot,
AsyncTask - самое то.
И не рекомендую использование таймера для повторных запусков твоего потока подключения.
ИМХО лучшая связка, что тебе сюда подойдет это AsyncTask + Handler:sendEmptyMessageDelayed(int what, long delayMillis).

Официальная документация + примерчики - AsyncTask
Официальная документация по Handler'у
Примерчик + дискуссия по AsyncTask'у
Handler example 1
Handler Structure Simple Example
0
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
06.04.2013, 14:24  [ТС] #10
lifestyle, я почитал про AsyncTask. Его нельзя повторно запускать.
А как тогда будет работать связка AsyncTask + Handler:sendEmptyMessageDelayed.
Нужно пересоздавать AsyncTask. Почему таймер не подойдет ?
0
lifestyle
Mobile Developer
232 / 228 / 4
Регистрация: 10.05.2009
Сообщений: 917
06.04.2013, 14:42 #11
xbarmaglot, thread тоже повторно запускать нельзя и что?)))
Да создаешь новый Instance вот и все)))
Таймер можно использовать, просто я его не люблю после наследования чужого кода с таймером и отловом багов. у него есть свои приколы. Если будешь его использовать то будь внимателен просто и не пропусти ничего.
0
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
06.04.2013, 17:04  [ТС] #12
Цитата Сообщение от lifestyle Посмотреть сообщение
xbarmaglot, thread тоже повторно запускать нельзя и что?)))
Да создаешь новый Instance вот и все)))
Таймер можно использовать, просто я его не люблю после наследования чужого кода с таймером и отловом багов. у него есть свои приколы. Если будешь его использовать то будь внимателен просто и не пропусти ничего.
просто поток я могу крутить бесконечно с ожидание нужного таймаута.
Просто никак не пойму принцип работы предложенной тобой связки...

Можно схематично примерчик ?
0
lifestyle
Mobile Developer
232 / 228 / 4
Регистрация: 10.05.2009
Сообщений: 917
06.04.2013, 20:35 #13
из асинк таска есть доступ к UI потоку а хэндлер будет принимать и отправлять сообщения через определенное тобой время
0
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 248
06.04.2013, 22:23  [ТС] #14
lifestyle, я в яве без года 2 дня, поэтому мне немного не понятно.
Таймеры к которым я привык можно было запускать с регулярной периодичностью. А тут нужно перезапускать.
Поэтому я не совсем понимаю как это.

Если не сложно - приведи пример...
0
lifestyle
Mobile Developer
232 / 228 / 4
Регистрация: 10.05.2009
Сообщений: 917
08.04.2013, 00:02 #15
Пример чего?!
перезапуск потока:
Java
1
2
3
4
5
6
private MyThread mThread = null;
 
public void startThread() {
    mThread = new MyThread();
    mThread.start();
}
0
08.04.2013, 00:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2013, 00:02
Привет! Вот еще темы с ответами:

Нету подключения WiFi - Windows 7
я сегодня купил себе ноутбук Toshiba(дальше не знаю) беда в том что я немогу найти и подключиться к WiF,ПОжалуйста помоги решить ету...

Очередность подключения устройств к wifi - Wi-Fi
Имеется следующая загадочная для меня ситуация: есть роутерт upvel ur315-bn, интернет к нему подведен и настроен вроде как правильно, ...

Подключения интернета через wifi - Wi-Fi
У нас проблема, когда у нас на обоих ноутбуках стояла виста-виста при создании сети компьютер-компьютер, после создании точки был выбор...

Подключения wifi карты (wlan) - Эмуляторы
Поставил через эмулятор Virtual Box убунту, основная система у меня Windows 7 Хочу сделать так, что бы убунту видел вай файл карту и мог...


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

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

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