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

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

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

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

19.04.2016, 16:38. Просмотров 189. Ответов 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() активити.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2016, 16:38     Не срабатывает код после цикла
Посмотрите здесь:

Android Не срабатывает onTouchEvent
После закрытия приложения пользователем код в таймере продолжает выполняться Android
Android Какой метод фрагмента срабатывает после закрытия диалога?
После добавления второго класса БД срабатывает исключение. Source not found Android
USB_DEVICE_ATTACHED не срабатывает Android
Android If срабатывает не на 0 а на -1
Не срабатывает событие OnListItemClick Android
Не срабатывает очистка БД Android
Не идет программа после цикла while Android
Android AsyncTask не выполняет код после завершения
Android Периодический alarm не срабатывает

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Frozik6k
 Аватар для Frozik6k
12 / 12 / 7
Регистрация: 04.04.2016
Сообщений: 50
20.04.2016, 08:22     Не срабатывает код после цикла #2
А переменная read вообще принимает значение -1 ?
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,195
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); и данных в канале нет то код дальше блокируется не знаете почему?
Frozik6k
 Аватар для Frozik6k
12 / 12 / 7
Регистрация: 04.04.2016
Сообщений: 50
21.04.2016, 10:59     Не срабатывает код после цикла #4
Попробуй установить тайм аут для сокета, ну скажем в 3000 миллисекунд
Java
1
socket.setSoTimeout(3000);
может тогда через это время read() бросит SocketTimeoutException.
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,195
21.04.2016, 12:02  [ТС]     Не срабатывает код после цикла #5
Это я уже решил делать надо просто чтение в отдельном потоке(чтение - блокирующая операция). А кстати такой вопрос socket.setSoTimeout(socket.setSoTimeout(3000);
); - просто переводит сокет в режим ожидания на заданное время? То есть если в течение того времени которое передаешь в таймаут ответ от сервера не пришел, то можно считать что где то был разрыв соединения так да? Правда еще IoException срабатывает в случае разрыва.
Frozik6k
 Аватар для Frozik6k
12 / 12 / 7
Регистрация: 04.04.2016
Сообщений: 50
21.04.2016, 13:38     Не срабатывает код после цикла #6
А еще новичок в программировании, и с сокетами не работал, так что точно не знаю как срабатывает socket.setSoTimeout. Это надо экспериментальным путем выяснить. Может покажусь совсем зеленым дилетантом, но может какую-нибудь завершающую последовательность данных отправлять, а при нахождении данной последовательности, прекращать чтение данных.
Yandex
Объявления
21.04.2016, 13:38     Не срабатывает код после цикла
Ответ Создать тему
Опции темы

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