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

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

Войти
Регистрация
Восстановить пароль
 
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
#1

Очередь из socket connect() как очистить? - Android

07.08.2016, 22:46. Просмотров 272. Ответов 14
Метки нет (Все метки)

Ситуация есть два устройства их нужно соединить по Bluetooth . Одно устройство с включенным датчиком с интервалом в пару секунд пытается подключиться выполняя socket.connect(); второе устройство выключено. Как только оно включается то соединение устанавливается, но проблема в другом. При выключенном втором устройстве естественно получаем ошибку соединения. Но ошибки приходят с задержкой . То есть цикл выполнился например 100 раз а получились всего 30-40 ошибок НО оставшиеся 70-60 ошибок соединения обязательно придут, все до одной в течении времени , даже если закрыть программу . То что пытается выполнять все 100 попыток socket.connect(); видно в логе. То есть фактически создается очередь. И необходимо ее после остановки цикла очистить. То есть прекратить попытки соединения. Как такое можно впринципе сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3058 / 1860 / 195
Регистрация: 13.01.2012
Сообщений: 7,082
08.08.2016, 06:16     Очередь из socket connect() как очистить? #2
Star2016, очевидно - при ошибке соединения не пытайтесь переподключаться.
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
08.08.2016, 09:26  [ТС]     Очередь из socket connect() как очистить? #3
проблема в том что это необходимо. То есть в случае потери связи запускается цикл для ее восстановления.
vxg
Модератор
3058 / 1860 / 195
Регистрация: 13.01.2012
Сообщений: 7,082
08.08.2016, 09:32     Очередь из socket connect() как очистить? #4
Star2016, у вас я так понял все это работает в потоке. при сбое приема-передачи или подключения делается новая попытка подключения. когда закрываете приложение просто поставьте флаг "хватит пытаться" и зарубите сокет - вылетит ошибка приема-передачи или подключения, но поток проверив флаг не станет ничего делать и просто завершится
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
08.08.2016, 09:59  [ТС]     Очередь из socket connect() как очистить? #5
Цикл работает с глобальной переменной из Singleton если true (соединение успешно) то прекращаются попытки соединения иначе продолжаются.
А как можно сделать то что вы предлагаете ? (если не трудно то на примере кода, пожалуйста).
vxg
Модератор
3058 / 1860 / 195
Регистрация: 13.01.2012
Сообщений: 7,082
08.08.2016, 11:06     Очередь из socket connect() как очистить? #6
Star2016
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
public class App extends Application {
    public static Thread thread = null;
 
    public static void startThread() {
        thread = new Thread(new Runnable() {
            public void run() {
                while (!Thread.currentThread().isInterrupted()) {
                /*
                делаем что-то
                если приложение уже не хочет что бы мы что-то делали
                просто прерываем поток
                */
                }
            }
        });
        thread.start();
    }
 
    public static void wait_for_thread() {
        if (thread != null) {
            try {
                thread.join();
            } catch (InterruptedException e) {
            }
        }
    }
 
    public static void interrupt() {
        if (thread != null) {
            thread.interrupt();
        }
    }
};
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
09.08.2016, 15:01  [ТС]     Очередь из socket connect() как очистить? #7
не помогло. На thread.interrupt(); не реагируют
Паблито
2063 / 1805 / 562
Регистрация: 12.05.2014
Сообщений: 6,432
Завершенные тесты: 1
09.08.2016, 15:02     Очередь из socket connect() как очистить? #8
код?
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
09.08.2016, 21:35  [ТС]     Очередь из socket connect() как очистить? #9
ситуация немного изменилась. Стало понятно что нужно

сделал так
Java
1
2
3
4
5
       myclThread.start();
        if (myclThread!=null)
        {
            myclThread.join();
        }
вставил я это в код activity . Все работает прекрасно. Теперь нет сотен открытых потоков . Потоки создаются один за одним отработал первый создается второй третий, НО идут сильные подвисания так как join тормозит основной поток. Мне теперь даже не надо закрывать потоки, они сами завершаются, НО от подвисаний как то надо избавиться
powowstal
27 / 27 / 4
Регистрация: 21.03.2013
Сообщений: 273
09.08.2016, 23:35     Очередь из socket connect() как очистить? #10
Star2016,
Цитата Сообщение от Star2016 Посмотреть сообщение
НО от подвисаний как то надо избавиться
только без ожидания join. Не проще в потоке после каждой интерации производить задержку sleep между следующим запросом на соединение. Или запустить поток в каком то Runable классе с использованием join.
vxg
Модератор
3058 / 1860 / 195
Регистрация: 13.01.2012
Сообщений: 7,082
10.08.2016, 08:21     Очередь из socket connect() как очистить? #11
Star2016, чего вы творите не ясно, код который я привёл рабочий, вашего кода не видели
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
10.08.2016, 16:27  [ТС]     Очередь из socket connect() как очистить? #12
печаль в том что с join получилось все отлично НО тормозит сильно (300 фреймов примерно пропускает)
со sleep пробовал - плохо. слишком медленно.

Добавлено через 10 минут
Ваш код хорош, но пока я разбирался в том коде что вы мне показали, я заметил join прочитал про него и понял что на нем можно реализовать работу потоков один за одним. То есть один поток попытался установить соединение , не получилось пошел второй поток, третий. То есть не открывается сразу много потоков а один за одним. НО беда в том что join почему то тормозит основной поток и естественно программу. Почему так происходит для меня загадка. Либо я как то не так использую join либо зачем тогда он нужен если он подвешивает основной поток

Join я использую так
Java
1
2
3
4
5
    myclThread.start();
        if (myclThread!=null)
        {
            myclThread.join();
        }
в моем понимании этот код выполняется так. В основном потоке запускаем myclThread после этого myclThread.join(); и это приводит к тому что запущенный поток выполняется а запуск остальных откладывается до завершения запущенного. Никак не могу понять почему точмозит основной
vxg
Модератор
3058 / 1860 / 195
Регистрация: 13.01.2012
Сообщений: 7,082
10.08.2016, 18:32     Очередь из socket connect() как очистить? #13
Star2016, тормозит потому что джой ждёт завершения потока. Не нужно ничего друг за другом запускать и ничего ждать - делайте все в ОДНОМ потоке - в бесконечном цикле делайте попытку подключится, если не вышло ещё и ещё и ещё... интерапт и джой только если задумали убить свой поток
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
10.08.2016, 19:10  [ТС]     Очередь из socket connect() как очистить? #14
Вот теперь я вашу идею полностью понял. Действительно, ваше решение лучше моего которое я только что придумал и которое работает. Видимо придется переписать.

Я решил проблему без join в самом верху run ставлю true внизу false и проверка при запуске потока если false (то есть предыдущий поток отработал) то запускаем новый поток. если true то бездействуем (ждем завершения). Работает хорошо, но ваше решение красивей и лучше.
Спасибо. Тему можно закрывать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2016, 15:59     Очередь из socket connect() как очистить?
Еще ссылки по теме:

Создание кастомной камеры. Fail to connect to camera service Android
Как очистить содержимое EditText? Android
Fail to connect to camera service Android
Не работает Jsoup.connect Android
Android Как очистить cookie в webview

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

Или воспользуйтесь поиском по форуму:
Mikhail1990
14 / 14 / 3
Регистрация: 22.03.2014
Сообщений: 200
11.08.2016, 15:59     Очередь из socket connect() как очистить? #15
Еще предложение, сам только что столкнулся с этой проблемой. На примере bluetoothchat android там есть класс SPPHelper и подкласс ConnectedThread (унаследован от Thread) он управляет всеми входящими/исходящими данными. В методе run() когда соединение было разорвано кидается исключение и поток останавливается. В том блоке в котором ловим это исключение шлем Handler.SendMessage() с командой на рестарт соединения (один раз так как после поток остановлен). В главном активити его ловим и там пытаемся запускать до посинения без создания доп потока.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while (true) {
 
                try {
                    BtRc = mmInStream.read(); //тут кидает исключение если обрыв 
                } catch (IOException e) {
 
                    //TODO save connection after screen orientation was changed
                    Log.e(TAG, "disconnected", e);
                    connectionLost();
 
                    //TODO re-establish a connection
                    Message msg = mHandler.obtainMessage(MainActivity.TRY_TO_RESTART);
                    Bundle bundle = new Bundle();
                    bundle.putString(MainActivity.RESTART, "Re-establishing a connection...");
                    msg.setData(bundle);
                    mHandler.sendMessage(msg);
 
                    return;//Receiving = false;
                }
//.......some code
}
Ловим в главном активити

Java
1
2
3
4
5
6
7
 case TRY_TO_RESTART:
                        String data = msg.getData().getString(RESTART);
                        Toast.makeText(App.getContext().getApplicationContext(), data, Toast.LENGTH_LONG).show();
 
                        theFrag.sppHelper.connect(theFrag.HC05device);
                    }
                    break;
Yandex
Объявления
11.08.2016, 15:59     Очередь из socket connect() как очистить?
Ответ Создать тему
Опции темы

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