Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Nokia S60 Internet access delay 
V
    Опции темы
eugine_s
Дата 25.3.2010, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17




Кто-нибудь встречал со следующей "фичей" (багом?) на Nokia S60 3rd Ed: 

Время от времени приложение должно лезть в интернет. При первой попытке соединения с интернетом телефон предлагает сделать выбор точки доступа. Но по какой-то причини бывает, что окно с выбором точки доступа появляется только через очень длительное время (например 50-100 и более секунд), хотя явных причин для этого нет, так как когда нужно подключиться к интернету создается новый поток и в новом потоке уже идет общение с интернетом. Вот код: 
Код


    public void start() {
        running = true;
        Thread t = new Thread(this);
        t.setPriority(Thread.MAX_PRIORITY);
        t.start();
    }

    public void run() {
        try {
            result = doPost();
        } catch (IOException ex) {
            failed = true;
        }
        running = false;
    }

    private String doPost() throws IOException {
        String res = null;
        HttpConnection http = null;
        InputStream is = null;
        OutputStream os = null;
        byte[] out_data = getPostBody();
        int len = out_data.length;

        http = (HttpConnection) Connector.open(url);
        http.setRequestMethod(HttpConnection.POST);
        http.setRequestProperty("Content-Type", "text/plain");
        String con_len = Integer.toString(len);
        http.setRequestProperty("Content-Length", con_len);

        os = http.openOutputStream();
        os.write(out_data);
//        os.flush();

        int rc = http.getResponseCode();
        if (rc != HttpConnection.HTTP_OK) {
            System.out.println("Wrong responce code: " +rc);
            throw new IOException("HTTP response code: " + rc);
        }
        is = http.openInputStream();
        len = (int) http.getLength();
        ByteArrayOutputStream baos;
        if (len > 0) {
            baos = new ByteArrayOutputStream(len);
            int actual = 0;
            int bytesread = 0;
            byte[] data = new byte[len];
            while ((bytesread != len) && (actual != -1)) {
                actual = is.read(data, bytesread, len - bytesread);
                bytesread += actual;
            }
            baos.write(data, 0, data.length);
        } else {
            baos = new ByteArrayOutputStream();
            int ch;

            while ((ch = is.read()) != -1) {
                baos.write(ch);
            }
        }
        res = new String(baos.toByteArray());
        baos.close();
        if (is != null) {
            is.close();
        }
        if (os != null) {
            os.close();
        }
        if (http != null) {
            http.close();
        }
        return res;
    }


Процесс появление окна выбора точки доступа можно "ускорить" - нажав, например, главное меню. В таком случае окно появляется сразу. 
Такое чувство, что когда вызываю создание нового потока - его что-то задерживает.
Кто-то сталкивался?

PM MAIL   Вверх
ivanovpv
Дата 26.3.2010, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 10
Всего: 28



Скорее всего это связано с непреемптивностью телефонной ОС или же тем, что ваш поток где производится соединение не дает дышать потоку ОС, который должен вызвать диалоговое окно выбора точки доступа. На эмуляторе видимо все работает - поскольку эмулятор пользуется преемптивностью ОС компа, а на реальном телефоне проблема, так?

Рецепта два:
1) Вызывать 
Код

Thread.sleep(100); 

где-нибудь в теле вашего потока. IMHO  в вашем случае это не поможет, поскольку в коннекте у вас нет явного цикла - куда бы воткнуть sleep()
2) Понизить приоритет вашего потока:
Код

public void start() {
        running = true;
        Thread t = new Thread(this);
        t.setPriority(Thread.NORM_PRIORITY-1);
        t.start();
    }



--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
eugine_s
Дата 26.3.2010, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



ivanovpv, спасибо.

Я собственно, так и думал, что проблема связана с потоками и их приоритетами.
Но ввиду специфики моего мидлета я ничего не могу изменить. 
Мой мидлет использует только один поток (и еще один, когда нужно подключиться к инету - вызывается метод start из кода в первом посте). 
Основной поток постоянно засыпает: 
Код

while(isActive()) {
 //do_update(); 
 Thread.sleep(100);
}

Поэтому проблема не в моих потоках, а других потоках, о которых я ничего не знаю. 
Специфика приложения такая, что я в приложение еще может быть несколько потоков, о которых я ничего не знаю и ничего не могу сделать с ними (т.е не могу их усыпить и не могу изменить им приоритет).

Тему можно считать закрытой. Если у кого-то возникнут похожие проблемы, то (как написал ivanovpv) решения два (я бы рекомендовал их оба применять): 
1) Основной поток усыплять на какое-то время, чтобы остальные потоки могли "вздохнуть". Например, Thread.sleep(100).
2) "Поиграйте" с приоритетами потоков. Только, наверное, правильнее у нужного потока повышать приоритет, а у других понижать. 
PM MAIL   Вверх
ivanovpv
Дата 29.3.2010, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 10
Всего: 28



Цитата(eugine_s @  26.3.2010,  15:00 Найти цитируемый пост)
Специфика приложения такая, что я в приложение еще может быть несколько потоков, о которых я ничего не знаю и ничего не могу сделать с ними (т.е не могу их усыпить и не могу изменить им приоритет).


Ну а почему бы не понизить приоритет вашего потока? Зачем ему сразу давать максимальный приоритет. Из-за этого потоки оси телефона не могут вздохнуть (мне так каатса...)


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
eugine_s
Дата 30.3.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Цитата(ivanovpv @  29.3.2010,  17:31 Найти цитируемый пост)
Ну а почему бы не понизить приоритет вашего потока? Зачем ему сразу давать максимальный приоритет.


Потому что: 
1) Про остальные потоки я ничего не знаю и когда они отработаю я не знаю. Мой поток, в свою очередь, должен фактически получить полный контроль, а не ждать кого-то.
2) Уже пробовал - было еще хуже. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0705 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.