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

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

Войти
Регистрация
Восстановить пароль
 
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,275
#1

Не срабатывает код после цикла - Программирование Android

19.04.2016, 16:38. Просмотров 215. Ответов 5
Метки нет (Все метки)

вот полный код потока
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
class ClientThread implements Runnable {
 
        @Override
        public void run() {
 
            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
 
                socket = new Socket(serverAddr, SERVERPORT);
                PrintWriter outprint = new PrintWriter(new BufferedWriter(
                        new OutputStreamWriter(socket.getOutputStream(), Charset.forName("UTF-8"))),
                        true);
                //DataInputStream in;
                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
                //int read = 0;
                int read = 0;
                //in = new DataInputStream(socket.getInputStream());
               // out=new DataOutputStream(socket.getOutputStream());
                //out.writeInt(x);
                outprint.println(STX);
                //out.writeChar(STX);
                outprint.flush();
               // BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                char[] mData = new char[28];
 
 
                    while ((read = reader.read(mData)) > 0) {
                        synchronized (this) {
                            wait(3000);
                        }
                        // Thread.sleep(3000);
 
                        String str = String.valueOf(mData);
 
                        Log.d("Func", str);
                        Log.d("Func", "" + read);
                    }
                Log.d("Func", "Yes"); //                            этот код не срабатывает
 
 
 
                //String message = in.readUTF();
 
//                Toast toast = Toast.makeText(getApplicationContext(),
                       // message, Toast.LENGTH_SHORT);
              //  toast.show();
 
 
            } catch (UnknownHostException e1) {
                Log.d("Func", "Host");
                e1.printStackTrace();
            } catch (IOException e1) {
                Log.d("Func", "No");
                e1.printStackTrace();
            }
        catch (Throwable throwable) {
            Log.e("Func", "No1");
            throwable.printStackTrace();
        }/*catch (InterruptedException e) {
                e.printStackTrace();
            }*/ /*catch (InterruptedException e) {
                Log.d("Func", "Interrupt");
                e.printStackTrace();
            }*/
 
        }
 
    }
Log.d("Func", str);
Log.d("Func", "" + read); срабатывает а Log.d("Func", "Yes");. Подскажите почему такое происходит? Как можно исправить? Ни один catch не срабатывает, в чем может быть проблема? Поток запускается в методе onCreate() активити.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2016, 16:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не срабатывает код после цикла (Программирование Android):

Не срабатывает AlarmManager после выключения экрана - Программирование Android
Доброго дня! Прошу помощи. Приложение выполняет отложенные задачи через AlarmManager. Все отлично работает, но пока приложение запущено...

Какой метод фрагмента срабатывает после закрытия диалога? - Программирование Android
Запускаю FragmentActivity, в методе onResume запускаю DialogFragment. Пока выполняются кое-какие действия, диалог висит, перекрыв...

После добавления второго класса БД срабатывает исключение. Source not found - Программирование Android
Было приложение с одним классом БД. всё работало. Затем добавил второй класс БД. после этого в активити на строке Cursor c2 =...

Не идет программа после цикла while - Программирование Android
Есть программа которая должна считывать данные с входящего Json и формировать ссылки, потом возвращать в класс doInBackground public...

ListView, База данных и SimpleCursorAdapter - onItemClick срабатывает только после добавления данных - Программирование Android
Здравствуйте! Подскажите, плиз, решение проблемы новичку... есть БД... подключаюсь через SimpleCursorAdapter ... Нажатие на строке...

Почему не срабатывает изменение границы цикла, принятое внутри цикла? - VBA
Работает цикл for-Next V_Rod = UBound(Rod, 2) For j = 1 To V_Rod For k = 1 To UBound(BD, 2) ReDim...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Frozik6k
12 / 12 / 7
Регистрация: 04.04.2016
Сообщений: 51
20.04.2016, 08:22 #2
А переменная read вообще принимает значение -1 ?
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,275
20.04.2016, 11:20  [ТС] #3
да принимает но дело не в этом я и меньше нуля пробовал и по разному. Проблему решает только вызов clientSocket->disconnectFromHost(); на стороне Qt сервера(то есть разрыв соединения) тогда код после цикла выполняется. Но я не могу понять почему так? Получается BufferedReader слушает сокет постоянно(блокирует дальнейшие действия). Просто если я хочу отправить на сервер данные, затем получить ответ, затем опять что то отправить - то мне получается нужно вешать BufferedReader на сокет, а в отдельном потоке делать отправку данных на сервер(или другие действия не связанные с чтением) или же вызывать disconnect на сервере. Но это не очень удобно. Хочется все делать в одном не главном потоке и при одном установленном соединении. Может в Java есть концепция неблокирующих сокетов(которые не блокируют выполнение кода)?

Добавлено через 36 минут
можете обьяснить следующее. Когда я делаю без цикла read = reader.read(mData); и данные в канале есть для чтения, то все норм я получаю ответ от сервера, вывожу количество бай прочитанных, дальше код выполняется все отлично, но если я вызываю read = reader.read(mData); второй раз и данных в канале уже нет(ответ получен), то я не могу даже вывести переменную read и дальше код не выполняется, происходит как бы блокировка выполнения кода
То есть если данных для чтения нету то BufferedReader переходит как бы в режим ожидания этих данных так получается?
То есть получается как бы блокирующий сокет да?
А сокет можно перевести в неблокирующий режим в андроид. Просто интересно?
То есть если вызвать reader.read(mData); и данных в канале нет то код дальше блокируется не знаете почему?
0
Frozik6k
12 / 12 / 7
Регистрация: 04.04.2016
Сообщений: 51
21.04.2016, 10:59 #4
Попробуй установить тайм аут для сокета, ну скажем в 3000 миллисекунд
Java
1
socket.setSoTimeout(3000);
может тогда через это время read() бросит SocketTimeoutException.
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,275
21.04.2016, 12:02  [ТС] #5
Это я уже решил делать надо просто чтение в отдельном потоке(чтение - блокирующая операция). А кстати такой вопрос socket.setSoTimeout(socket.setSoTimeout(3000);
); - просто переводит сокет в режим ожидания на заданное время? То есть если в течение того времени которое передаешь в таймаут ответ от сервера не пришел, то можно считать что где то был разрыв соединения так да? Правда еще IoException срабатывает в случае разрыва.
0
Frozik6k
12 / 12 / 7
Регистрация: 04.04.2016
Сообщений: 51
21.04.2016, 13:38 #6
А еще новичок в программировании, и с сокетами не работал, так что точно не знаю как срабатывает socket.setSoTimeout. Это надо экспериментальным путем выяснить. Может покажусь совсем зеленым дилетантом, но может какую-нибудь завершающую последовательность данных отправлять, а при нахождении данной последовательности, прекращать чтение данных.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2016, 13:38
Привет! Вот еще темы с ответами:

Не работает код после цикла - C#
Доброго времени суток, в этом коде программа игнорирует все что написано после первого цикла. Ставил точку остановки на второй цикл - не...

Не выполняется код после цикла - C (СИ)
Всем доброго времени суток. 2 дня назад я решил серьёзно взяться за изучение С. По совету многих знакомых читаю Кернигана и Ритчи. У меня...

После многих итераций цикла вылетает код - PascalABC.NET
Цикл, каждые 5 секунд проверяется txt из Интерента. Если он имеет определённое содержание, запускается окно. После примерно полчаса-час...

после цикла for код останавливается без предупреждений об ошибке - Visual Basic .NET
Здравствуйте! Изучаю vb.net 2010. Прошу помощи в одном вопросе: есть два listbox, 2й (lbЗначения) заполняется из БД в зависимости от...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.04.2016, 13:38
Ответ Создать тему
Опции темы

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