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

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

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

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

19.04.2016, 16:38. Просмотров 209. Ответов 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     Не срабатывает код после цикла
Посмотрите здесь:

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

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

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

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

AsyncTask не выполняет код после завершения - Программирование Android
При окончании работы doInBackground не вызывается onPostExecute класс ParseTask: public class ParseTask extends AsyncTask<String,...

После закрытия приложения пользователем код в таймере продолжает выполняться - Программирование Android
Если запустить таймер в android с периодом в пять секунд выполнения действия и в функции run() накодить какой то процесс. То после закрытия...

If срабатывает не на 0 а на -1 - Программирование Android
Здравствуйте. Сразу извиняюсь за возможно глупый вопрос, и возможно даже что не по андройд а по java в общем. Проблема в следующем: ...

USB_DEVICE_ATTACHED не срабатывает - Программирование Android
пишу программу которой нужно определить подключена ли к телефону флешка. при отключении (USB_DEVICE_DETACHED) сообщение срабатывает,а при...

Не срабатывает очистка БД - Программирование Android
Почему не срабатывает очистка таблицы? void clearTable(String TableName){ DataBase dbHelper = new DataBase(this); ...

Не срабатывает onTouchEvent - Программирование Android
Всем доброго Вечера, недавно занимаюсь программирование под Android. Каким образом реализовать корректную обработку onTouchEvent в ниже...


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

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

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