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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Версия и билд ява-машины девайса? как определить? 
V
    Опции темы
Antropoid
Дата 15.2.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Можно определить версию и билд ява-машины девайса?


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Dancer
Дата 15.2.2007, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

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



а зачем  тебе это нужно?

Для девайсов, где Java встраиваемая эта версия никак не коррелирует с JDK версиями (потому что не только Sun машину используют,как правило в основном не Sun машину встраивают smile ), ну и вытащить ты это дело не сможешь.
Для смартфонов, куда ты можешь ставить Java машину, ты можешь это посмотреть, но для чего?


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Antropoid
Дата 15.2.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Это нужно, чтобы удостовериться, что проблема не в коде, не в девайсе, а именно в реализации библиотечной функции.


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Dancer
Дата 15.2.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

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



сделай тестовый мидлет и прогони его. То как реализуют библиотечную функцию при портировании KVM в телефон - это "страшное дело" smile, помимо того, что будет вызываться в нативе ещё есть и фреймворк, который производитель девайса может сделать самостоятельно и уже потом в этом фреймворке дёргать ту самую библиотечную функцию. 
Опиши что именно тебе нужно (классы, методы, передаваемые параметры, что ожидаешь получить и т.д.), может помогу тестик накатать. (можешь в приват, если светиться не хочешь)


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Antropoid
Дата 15.2.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Вообщем, это не такой уж и секрет - пусть все знают  smile 

Схематично проблема выглядит так:
Код

    StreamConnection cn = (StreamConnection)Connector.open(conURL);
    InputStream in = cn.openInputStream();

    int length = 0;
         int i=0;
    byte data[] = new byte[128];
    while(true) {
        length = in.read(data, i, 1);//<---ну и что здесь не так???
...
         }

в цикле считывается информация с GPS - приемника. Через 5 сек.(SE M600) - 5 мин.(SE P990) происходит блокировка функцией read(...). Почему? GPS - приемник при этом включен. Дело в девайсе? На остальных тестируемых девайсах такой проблемы не наблюдается. Если хоть бы таймаут можно было устанавливать, после которого блокирующая функция read(...) бросает Эксцепшн, а то этого тайм-аута уж слишком долго приходится ждать. Так что  smile 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Dancer
Дата 16.2.2007, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

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



Код

import java.util.TimerTask;
import java.util.Timer;
public class ServerTimeOut extends TimerTask {
    final static long PACKET_TIME_OUT = 60000; //timeOut of milliseconds

    private static ServerTimeOut instance = new ServerTimeOut();
    private static Timer timerOfTimeOut = null;

    public void run() {
        instance.cancel();
        if(MyClass.getStatus() == MyClass.READING) {
          //значит мы читаем уже PACKET_TIME_OUT миллисекун с последнего взведения таймер, а это многововато
          // и нужно что-то сделать чтобы убить наш поток, который делает чтение и выдать какую-то нотификацию
          // о том, что звиняйте, долго это шло. время ожидания превышено и т.д.
            MyClass.stopReadingTread();     
        }

            return;
    }

    public static ServerTimeOut getInstance() {
        return instance;
    }

    public synchronized static void schedule() {
        if(timerOfTimeOut != null) {
            timerOfTimeOut.cancel();
            timerOfTimeOut = null;
        }
        timerOfTimeOut = new Timer();
        timerOfTimeOut.schedule(new ServerTimeOut(), PACKET_TIME_OUT);
    }

    public synchronized boolean cancel(){
        timerOfTimeOut.cancel();
        timerOfTimeOut = null;
        boolean bool =super.cancel();
        return bool;
    }

    public void setTimerOfTimeOut(Timer timer) {
        timerOfTimeOut = timer;
    }

    public static Timer getTimerOfTimeOut() {
        return timerOfTimeOut;
    }
}


Код

public class MyClass {
   public static final int READY = 0;
   public static final int READING =1;
   public static final int STOP =2;

... и так далее, описываешь всякую ботву, которая может пригодиться
   private static int currentStatus = READY;
   private static Thread readingThread;
   private static boolean stop = false;

   public static int getStatus() {
       return currentStatus;
   }

   public synchronized void readData() {
       while(readingThread!=null) {
           wait();
       }
if(!stop) {
       readingThread = new Thread(new Runnable() {
             public void run() {
                 currentStatus = READING;
                 StreamConnection cn = (StreamConnection)Connector.open(conURL);
                 InputStream in = cn.openInputStream();

                 int length = 0;
                 int i=0;
                 byte data[] = new byte[128];
                      ServerTimeOut.schedule();
                      length = in.read(data, i, 1);//<---ну и что здесь не так???
                      ...
             }
       }).start();
}
   }

    public synchronized  void stopReadingTread() {
       currentStatus = STOP;
       stop = true;
       readingThread=null;
       System.gc();
       notify();
   }
}


Я думаю, что как-то вот так. Писалось не коленке smile, так что сильно не ругайтесь.
То есть, читаешь каждый раз что-то заводишь таймер, если следующее чтение происходит раньше чем таймер истечёт, то таймер устанавливается новый. В таймер должна быть проверка на то, в каком состоянии мы сейчас находимся, на момент, когда таймер сработал. Если в состоянии чтения, то значит что-то пошло не там и мы тут повисли. (как и что тебе в этой ситуации предпринимать, думаю ты сам уже давно решил smile)
Где-то в другом месте далаешь вызовы MyClass.readData() по необходимости. (ну или как-то так. думаю принцип понятен)


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Antropoid
Дата 16.2.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Цитата(Dancer @  16.2.2007,  11:50 Найти цитируемый пост)
 Если в состоянии чтения, то значит что-то пошло не там и мы тут повисли. (как и что тебе в этой ситуации предпринимать, думаю ты сам уже давно решил

в этом-то и вся загвоздка: если прервать тред, в котором произошла блокировка, то подсоединиться к GPS-у уже неудастся, т.к. открытое соединение нужно вначале закрыть. А как его закрыть, когда оно занято блокирующей функцией read()?


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Dancer
Дата 16.2.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

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



всё в null, и при следующем обращении, делай заново коннекшн.
Connection у тебя должен быть один единый, если он null, то значит его сначала нужно открыть, если уже есть, то брать из этого коннекшена InputStream.


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Antropoid
Дата 17.2.2007, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Цитата(Dancer @  16.2.2007,  15:01 Найти цитируемый пост)
всё в null, и при следующем обращении, делай заново коннекшн.

Что в null? StreamConnection cn ?
Если его ставить в null, а потом делать коннект, то вылетает Эксцепшн с информацией о том, что коннекшн уже открыт. Закрыть же его не удается, т.к. соединение занято(функция read() не отпускает).

Если же StreamConnection cn 
Цитата(Dancer @  16.2.2007,  15:01 Найти цитируемый пост)
уже есть, то брать из этого коннекшена InputStream.
, то и здесь выпадает java.io.IOException.

 smile 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Antropoid
Дата 20.2.2007, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Проблема решена.
Блокировка происходит из-за переполнения Bluetooth-буфера девайса. Оказывается отправка происходит за плечами программиста! Если делать 
Код

skip(128);

после 
Код

length = in.read(data, i, 1);

то все работает.

Другое дело, что skip(128) данных мне не подходит, но это уже совсем длугая история smile 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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