Форум программистов, компьютерный форум CyberForum.ru

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

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

Ожидание подключения wifi - Android

30.03.2013, 13:03. Просмотров 2740. Ответов 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 приходит в том же потоке.

Как еще можно дождаться ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 245
02.04.2013, 11:54  [ТС]     Ожидание подключения wifi #2
Никто не делал ?
lifestyle
Mobile Developer
231 / 227 / 4
Регистрация: 10.05.2009
Сообщений: 917
03.04.2013, 01:27     Ожидание подключения wifi #3
попробуй receiver.waitForConnection() вынести в отедльный поток или в asyncTask... или вообще без него проверь если броадкаст ловится вообще

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

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

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

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

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

Если не сложно - приведи пример...
lifestyle
Mobile Developer
231 / 227 / 4
Регистрация: 10.05.2009
Сообщений: 917
08.04.2013, 00:02     Ожидание подключения wifi #15
Пример чего?!
перезапуск потока:
Java
1
2
3
4
5
6
private MyThread mThread = null;
 
public void startThread() {
    mThread = new MyThread();
    mThread.start();
}
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 245
08.04.2013, 09:15  [ТС]     Ожидание подключения wifi #16
Цитата Сообщение от lifestyle Посмотреть сообщение
Пример чего?!
перезапуск потока:
Java
1
2
3
4
5
6
private MyThread mThread = null;
 
public void startThread() {
    mThread = new MyThread();
    mThread.start();
}
не поток, а таймер. он должен сработать через 10 мин
и опять запуститься на 10 мин, каждый раз пересоздавая asynctask.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2014, 16:17     Ожидание подключения wifi
Еще ссылки по теме:

Android Ожидание ответа от запроса к серверу по сети
Android Ошибка подключения через ssl
Android Верстка, без подключения API
Обработка ошибки подключения по Bluetooth Basic4Android
Android Подключение к WiFi

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

Или воспользуйтесь поиском по форуму:
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 245
04.02.2014, 16:17  [ТС]     Ожидание подключения wifi #17
lifestyle, опять поднимаю тему.
Как и говорилось выше - вынес всю работу в AsynkTask.
Но через некоторое время заметил, что подключение стало занимать, иногда, десятки минут.
Хотя таймаут стоит на 60 сек. Может садясь на await я для текущего потока блокирую приход Intent для
BroadcastReceiver ? Как тогда быть ?

На всякий случай код
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
final class ConnectivityReceiver extends BroadcastReceiver
{
    private final int m_ntype;  
    private final CountDownLatch m_wait = 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.w(this.getClass().getName(), "Отсутствуют данные о сети");
            return;
        }           
        NetworkInfo ninfo = bundle.getParcelable(ConnectivityManager.EXTRA_NETWORK_INFO);
        if (ninfo == null)
        {
            Log.w(this.getClass().getName(), "Отсутствуют данные о сети");
            return;         
        }
        if ((ninfo.getType() == m_ntype) && ninfo.isConnected())
        {
            m_wait.countDown();             
        }
    }
 
    public boolean waitConnection()
    {
        try
        {
            Log.w(this.getClass().getName(), "Ожидаем подключения...");
            return m_wait.await(60, TimeUnit.SECONDS);
        }
        catch (Exception ex)
        {       
            Log.e(Network.WiFi.class.getName(), "Ошибка ожидания подключения");
        }
        return false;
    }
}
 
public class Network
{
    public static final boolean pingGoogle()
    {
        try
        {
            Process process = Runtime.getRuntime().exec("ping -c 1 -w 1 www.google.com");
            return (process.waitFor() == 0);                    
        }
        catch (Exception ex)
        {
            Log.e(Network.class.getName(), "Ошибка опроса www.google.com");
        }   
        return false;
    }
    
    public static class Mobile
    {
        public synchronized static final boolean isOnline(Context context)
        {
            final ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            if (manager == null)
            {
                Log.w(Network.Mobile.class.getName(), "Ошибка доступа к службе CONNECTIVITY_SERVICE");
                return false;           
            }
            
            final NetworkInfo mobile = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            if ((mobile != null) && mobile.isConnected())
            {
                Log.i(Network.Mobile.class.getName(), "Доступен mobile internet");
                return true;
            }
            return false;   
        }
    }
    
    public static class WiFi
    {       
        public synchronized static final boolean isOnline(Context context)
        {
            final ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);    
            if (manager == null)
            {
                Log.w(Network.WiFi.class.getName(), "Ошибка доступа к службе CONNECTIVITY_SERVICE");
                return false;           
            }
            
            final NetworkInfo info = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);        
            if ((info != null) && info.isConnected())
            {
                Log.i(Network.WiFi.class.getName(), "WiFi уже включен");
                return true;
            }                   
            return false;
        }
        
        public synchronized static final boolean connect(Context context)
        {
            if (isOnline(context)) return true;
            
            final WifiManager manager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
            if (manager == null)
            {
                Log.w(Network.WiFi.class.getName(), "Ошибка доступа к службе WIFI");
                return false;           
            }
            
            ConnectivityReceiver receiver = new ConnectivityReceiver(ConnectivityManager.TYPE_WIFI);
            IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);                    
            context.registerReceiver(receiver, filter);
 
            try
            {       
                Log.i(Network.WiFi.class.getName(), "Включение wifi");
                if (!manager.setWifiEnabled(true))
                {
                    Log.w(Network.WiFi.class.getName(), "Ошибка включения wifi");
                    return false;                                   
                }
                if (!receiver.waitConnection())
                {
                    Log.w(Network.WiFi.class.getName(), "Не удалось подключиться к сети");
                    return false;                                                           
                }           
                Log.i(Network.WiFi.class.getName(), "Подключились к WIFI");
                return true;
            }
            finally
            {
                context.unregisterReceiver(receiver);
            }               
        }
        
        public synchronized static final boolean disconnect(Context context)
        {
            final WifiManager manager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
            if (manager == null)
            {
                Log.w(Network.WiFi.class.getName(), "Ошибка доступа к службе WIFI");
                return false;           
            }
            return manager.setWifiEnabled(false);
        }
    }
}
Yandex
Объявления
04.02.2014, 16:17     Ожидание подключения wifi
Ответ Создать тему
Опции темы

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