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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> На эмуляторе и Нокии работает, на SE - нет 
:(
    Опции темы
AncleFedor
Дата 18.8.2008, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2008

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



 Всем привет. Написал несколькостраничный мидлетик. На эмуляторе SE W810 и на живой Нокии 6131 (кажись) все рабоает почти как надо, за исключением того, что под нокию не совсем правильно масштабируется разрешение. Запускаю на живом SE W810 - вторая страничка не отрисовывается, всю голову сломал уже. Варианты были: неправильно рассчитываю базовое разрешение и из-за этого рисую за пределы экрана; глючит вывод русского текста; забываю репейнтить... Может кто еще что подскажет?
PM MAIL   Вверх
Firexel
Дата 19.8.2008, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 21.6.2008

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



Ты используешь Canvas, я правильно понимаю? Иногда возникают ошибки при вызове getWidth и getHeight если ты их вызываешь не в paint(). попробуй убрать вызовы getWidth и getHeight отовсюду кроме paint() и выкрутится через статические переменные. Может поможет. А вообще - код в студию.
PM MAIL WWW ICQ Jabber   Вверх
AncleFedor
Дата 19.8.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2008

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



Все не так просто... Код пока в студию вынести не могу, вечером только, но на словах сейчас расскажу, что получилось добиться. 
Я в своем мидлете использую kXML. Загружаю файл с инета, беру от него InputStreamReader, который передаю в процедуру отрисовки, там успешно инициализирую хмл-парсер, но как только делаю parser.nextTag(), вываливается ошибка org.xmlpull.v1.XmlPullParserException: Unexpected EOF. Причем перед первым nextTag() я делаю и reset() InputStreamReader'а и ready() дает true... Естественно в цикле я проверяю достижение конца файла и на эмуляторе это все проходит без всяких задоринок, да и на разных нокиях (все никак до самсунгов не доберусь) работает как надо. А уже на трех моделях SE валится. 
PM MAIL   Вверх
AncleFedor
Дата 19.8.2008, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2008

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



Вообщем дело, похоже, оказалось в глючности kXML'я. Он валился на самой первой строчке хмл-файла
<?xml version="1.0" encoding="UTF-8"?>
Убрал ее, и вышеописанная ошибка исчезла. Правда получилась другая, но это уже вопрос отдельный. Кстати может быть как раз из разряда getWidth и getHeight. 
И еще вопрос, может ли валиться из-за того, что я мимо координат рисовать начинаю или выхожу за рамки экрана?
PM MAIL   Вверх
eugine_s
Дата 19.8.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(AncleFedor @  19.8.2008,  09:57 Найти цитируемый пост)
И еще вопрос, может ли валиться из-за того, что я мимо координат рисовать начинаю или выхожу за рамки экрана? 


Все может быть smile

Но маловероятно, скорее всего ошибка в другом.

Если валится, то желательно код и ошибку в студию (кстати, у SE проблем с этим нет, так как в комплекте SE WTK входит On-Device Debug - очень удобная штука).
PM MAIL   Вверх
AncleFedor
Дата 20.8.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2008

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



Скачал SE WTK, интегрировал с Eclipse'ой, повертел, покрутил... Но что-то или я ожидал бОльшего от On-Device Debug, или я не до конца разобрался. Правильно ли я понимаю, что можно только видеть консольный вывод мидлета и останавливать/запускать его когда захочешь? Или все же можно производить полноценный дебаг с просмотром состояний перемнных и т.п.? Ткните хоть на какой-нибудь туториал чтоли...
Ну и по коду... Я слегка локализовал место возникновения "ошибки", но легче мне от этого оне стало. Вот какая ситуация:

Вот тут вот и возникает непонятки, в месте, указанном комментарием 
Код

        try {
            KXmlParser parser = new KXmlParser();
            log(g, "Parser creat");
            reader.reset();
            log(g, "Reader reset");
            parser.setInput(reader);
            log(g, "Parser setInput");
            J2MEMap map = new J2MEMap();
            log(g, "reader :"+reader.ready());
            parser.nextTag();
            log(g, "Parser nextTag");
            parser.require(XmlPullParser.START_TAG, null, "form");
            while(parser.getEventType() != XmlPullParser.END_DOCUMENT) {
                if(parser.getEventType() == XmlPullParser.START_TAG) {
                    log(g,"Name ["+parser.getName()+"]"); //Вот это выводится
                    if(parser.getName().equalsIgnoreCase("ctr")) { //это условие не выполняется
                        log(g, "before DrawElement"); 
                        FormProcessor.drawElement(g, map, m_width, m_height); 
                        log(g, "Element was drown");
                        map.empty();
                        log(g, "Map was empted");
                    }
                    int idx = parser.getAttributeCount();
                    for(int i=0; i<idx; i++) //Этот цикл выполняется и выводится все сообщения
                        {
                            map.put(parser.getAttributeName(i), parser.getAttributeValue(i));
                            System.out.println("Attr name["+parser.getAttributeName(i)+"]; attr value["+parser.getAttributeValue(i)+"]");
                            log(g, "Attr name["+parser.getAttributeName(i)+"]; attr value["+parser.getAttributeValue(i)+"]");
                        }
                } else if(parser.getEventType() == XmlPullParser.TEXT && parser.getText().trim().length()>0) 
                    { //этот пролетаем мимо
                        map.put(Constants.CONTROL_ATTR_TEXT, parser.getText());
                        System.out.println("Text ["+parser.getText()+"]");
                        log(g,"Text ["+parser.getText()+"]");
                    }
                
                    try {
                        parser.next();
                    } catch (Exception e) {
                                           //а вот этот экзепшн срабатывает, хотя я не понимаю почему
                        break;
                    }
            }




Это был кусок метода public void paint(Graphics g) в обычном классе, конструктор которого выглядит так:
Код

    public BasePage(int color, int width, int height, InputStreamReader reader) {
        m_color = color;
        m_width = width;
        m_height = height;
        this.reader = reader;
    }


Код метода log до тривиальности прост:
Код

//private int currStr = 0; Счетчик строк, чтобы на экране телефона они распологались по порядку
    private void log(Graphics g, String msg) {
        System.out.println("[LogMessage] "+msg);
        g.setColor(0,0,255);
        g.drawString(msg.length()<25?msg:msg.substring(0,25), 10, (currStr++*15)+10, Graphics.LEFT|Graphics.BASELINE);        
    }



Это второй вариант моего сообщения, потому что пока писал первый, немного разобрался и еще чудок продвинулся в своих изысканиях smile
Сейчас корю себя за то, что глушу вывод экзепшина в 27-29 строках, но сейчас править код нет возможности, хотя пожелания и соображения все равно принимаются.

Да, вот еще и кусок того xml'я:
Код

<form id="0" caption="welcome">
<ctr type="rectangle">
<sz h="220" w="176"/>
<pos x="0" y="0"/>
<stl fgc="16777215" bgc="16777215" con=""/>
</ctr>
<!-- и т.д. -->
</form>




PM MAIL   Вверх
eugine_s
Дата 20.8.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1. Попробуй вместо InputStreamReader использовать InputStream.

Я уже не помню почему, но у меня в проект с kxml пришлось отказаться от reader-а и использовать InputStream (сужу об этом, так как строки с reader-ом сейчас закоменчены).

Код

InputStream is;
parser.setInput(is, "UTF8");


2. Что в логи выводиться покажи.

3. Exception нужно обработать и хотя бы в лог вывести, что ему не нравиться.

что-то типа такого:
Код

catch (Exception e) {
log(g, "Exception: " + e);
}


4.  Без вот это нельзя обойтись?

Код

reader.reset();

log(g, "reader :"+reader.ready());


5. Вот это:
Код

parser.require(XmlPullParser.START_TAG, null, "form");

Может бросать exception, так как первой идет XmlPullParser.START_DOCUMENT, а потом START_TAG (хотя тут я не уверен и могу ошибаться.).

PM MAIL   Вверх
AncleFedor
Дата 20.8.2008, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2008

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



Цитата(eugine_s @  20.8.2008,  13:34 Найти цитируемый пост)
1. Попробуй вместо InputStreamReader использовать InputStream.


Да, это идея. Попробую.


Цитата(eugine_s @  20.8.2008,  13:34 Найти цитируемый пост)
2. Что в логи выводиться покажи.

Пока могу только что на телефон выводится показать
Код

Parser create
Reader reset
Parser setInput
reader :true
Parser nextTag
Name [form]
Attr name[id]; attr value[0]
Attr name[caption]; attr value[welcome]



Цитата(eugine_s @  20.8.2008,  13:34 Найти цитируемый пост)
3. Exception нужно обработать и хотя бы в лог вывести, что ему не нравиться.


Ну это понятно, это я пропустил, сам виноват


Цитата(eugine_s @  20.8.2008,  13:34 Найти цитируемый пост)
4.  Без вот это нельзя обойтись?
    
reader.reset();
log(g, "reader :"+reader.ready());


в лог, конечно, можно не писать. Но ридер приходится сбрасывать на начало каждый раз, чтобы при возвращении к этой форме хмл-ник сначала читался


Цитата(eugine_s @  20.8.2008,  13:34 Найти цитируемый пост)
5. Вот это:

parser.require(XmlPullParser.START_TAG, null, "form");

Может бросать exception, так как первой идет XmlPullParser.START_DOCUMENT, а потом START_TAG (хотя тут я не уверен и могу ошибаться.).


Ну с этим я вроде бы разобрался, это типа assert'а чтобы убедиться, что там должно быть именно это, т.е. что ты схавал свой хмл-ник, а не чужой. Он действительно бросает экзепшн, если чего не так, но я его ниже по коду ловлю, просто я не показал этого.
PM MAIL   Вверх
eugine_s
Дата 20.8.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(AncleFedor @  20.8.2008,  15:31 Найти цитируемый пост)
в лог, конечно, можно не писать. Но ридер приходится сбрасывать на начало каждый раз, чтобы при возвращении к этой форме хмл-ник сначала читался


Попробуй обойтись без сбрасывания ридера, попробуй открывать заново, если нужно. (имхо, is.reset() - слабое это место в j2me)

Код

log(g,"Name ["+parser.getName()+"]"); //Вот это выводится
                    if(parser.getName().equalsIgnoreCase("ctr")) { //это условие не выполняется


Из логов я не вижу, что "Вот это выводится" для ctr. ctr - не обрабатывается. До него дело не доходит (судя по логам).

Вообщем, смотри что Exception-ы у тебя выводят.
PM MAIL   Вверх
AncleFedor
Дата 20.8.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2008

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



Цитата(eugine_s @  20.8.2008,  17:04 Найти цитируемый пост)
Из логов я не вижу, что "Вот это выводится" для ctr


Ну в общем да, все глохнет на <form>, согласен.
За наводки спасибо, буду крутить с ридерами и вставлять вывод экзепшенов, а там видно будет.
PM MAIL   Вверх
eugine_s
Дата 20.8.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(AncleFedor @  20.8.2008,  12:27 Найти цитируемый пост)
else if(parser.getEventType() == XmlPullParser.TEXT && parser.getText().trim().length()>0) 

Вот тут кстати проверь еще, что бы parser.getText() != null;
PM MAIL   Вверх
AncleFedor
Дата 20.8.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2008

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



А разве вот это условие 
Код

parser.getEventType() == XmlPullParser.TEXT

не дает гарантию, что там что-то есть?

Но на всякий случай поправлю.
PM MAIL   Вверх
eugine_s
Дата 20.8.2008, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(AncleFedor @  20.8.2008,  18:30 Найти цитируемый пост)
А разве вот это условие  не дает гарантию, что там что-то есть?


Я не знаю, что kXML генерирует в вот таком случае: 

Код

<form...><crt.... >

или 

<form...>
<crt.... >


Что будет между form и crt.

PM MAIL   Вверх
AncleFedor
Дата 20.8.2008, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2008

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



Ошибка в том месте:
Код

                    try {
                        parser.next();
                    } catch (Exception e) {
                                           //а вот этот экзепшн срабатывает, хотя я не понимаю почему
                        break;
                    }


была :
Код

org.xmlpull.v1.XmlPullParserException: name expected (position:START_TAG <null>@2:3 in java.io.InputStreamReader@ff91a2b7)


InputStreamReader заменил на InputStream

reader.reset() убрал

пока ничего не помогло.

Продолжаю изыскания...

Это сообщение отредактировал(а) AncleFedor - 20.8.2008, 23:11
PM MAIL   Вверх
AncleFedor
Дата 21.8.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2008

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



Что-то мой предыдущий пост не прошел...
Смысл был примерно в следующем, я сделал вот так:
Код

try {
                        log(g, "Event type = " + parser.next());
                    } catch (Exception e) {
                                           //Тут всякие другие выводы в ог и не только
                        break;
                    }


В итоге, в логе все-таки появляется строка 
Код

Event type = 4 //4 - это TEXT

А уж после этой строки - текст экзепшена, что я приводил выше. Т.е. parser.next() все же срабатывает и отрабатывается, но теперь я вообще не понимаю, почему происходит ошибка  smile 

Еще вставил-таки проверку чтобы getText не был null, но ничего не дало.


eugine_s, может у тебя есть пример обработки хмл-ника с помощью kXML , которым не жалко поделиться? А то я уже задолбался с мельницами воевать...
PM MAIL   Вверх
Shushpanchik
Дата 21.8.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 17.7.2007
Где: Россия, г. Пенза

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



Цитата

пример обработки хмл-ника с помощью kXML


Код

private void parseVersion(String strXml) {
//    strXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><info><version>1.0.1</version><message>Загрузи обновление и будет тебе щастье!</message><url>server.ru/midlet/midlet.jad</url></info>";
    KXmlParser parser = null;
    StringBuffer sbufError = null;
    boolean bVersion = false;
    boolean bMessage = false;
    boolean bUrl = false;
    boolean bInfo = false;
    boolean bError = false;
    String strVersion = null;
    String strMessage = null;
    String strUrl = null;
    int event;
    boolean bParse = true;
    try {
        byte[] bytXml = strXml.getBytes(DEF_ENC);
        ByteArrayInputStream bais = new ByteArrayInputStream(bytXml);
        parser = new KXmlParser();
        parser.setInput(bais, DEF_ENC);
        while (bParse) {
            event = parser.next();
            switch (event) {
                case XmlPullParser.START_TAG:
                    if (parser.getName().toLowerCase().equals(TAG_VERSION)) {
                        bVersion = true;
                        bInfo = false;
                    } else if (parser.getName().toLowerCase().equals(TAG_MESSAGE)) {
                        bMessage = true;
                        bInfo = false;
                    } else if (parser.getName().toLowerCase().equals(TAG_URL)) {
                        bUrl = true;
                        bInfo = false;
                    } else if (parser.getName().toLowerCase().equals(TAG_INFO)) {
                        bInfo = true;
                    } else if (parser.getName().toLowerCase().equals(TAG_ERROR)) {
                        bError = true;
                        sbufError = new StringBuffer();
                        for (int i = 0; i < parser.getAttributeCount(); i++) {
                            String strAttrName = parser.getAttributeName(i);
                            if (strAttrName.toLowerCase().equals(TAGATTR_ERR_CODE)) {
                                sbufError.append('#');
                                sbufError.append( parser.getAttributeValue(i) );
                                sbufError.append(": ");
                                break;
                            }
                        }
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if (parser.getName().equals(TAG_INFO)) {
                        bParse = false;
                        m_strSrvVersion = strVersion;
                        m_strUpdMsg = strMessage;
                        m_strUpdUrl = strUrl;
                    } else if (parser.getName().equals(TAG_VERSION)) {
                        bVersion = false;
                    } else if (parser.getName().equals(TAG_MESSAGE)) {
                        bMessage = false;
                    } else if (parser.getName().equals(TAG_URL)) {
                        bUrl = false;
                    } else if (parser.getName().equals(TAG_ERROR)) {
                        bParse = false;
                        m_bError = true;
                        m_strErrMsg = sbufError.toString();
                    }
                    break;
                case XmlPullParser.TEXT:
                    if (bVersion) {
                        strVersion = parser.getText();
                        if (strVersion == null) {
                            m_bError = true;
                            m_strErrMsg = ERR_NOVALUE;
                            throw new XmlPullParserException(ERR_NOVALUE);
                        }
                    } else if (bInfo) {
                        String str = parser.getText();
                        if (str != null && !str.trim().equals("")) {
                            m_bError = true;
                            m_strErrMsg = str;
                            throw new XmlPullParserException(str);
                        }
                    } else if (bMessage) {
                        strMessage = parser.getText();
                        if (strMessage == null) {
                            m_bError = true;
                            m_strErrMsg = ERR_NOVALUE;
                            throw new XmlPullParserException(ERR_NOVALUE);
                        }
                    } else if (bUrl) {
                        strUrl = parser.getText();
                        if (strUrl == null) {
                            m_bError = true;
                            m_strErrMsg = ERR_NOVALUE;
                            throw new XmlPullParserException(ERR_NOVALUE);
                        }
                    } else if (bError) {
                        String strMsg = parser.getText();
                        if (strMsg == null)
                            strMsg = ERR_UNDEF_MSG;
                        else
                            sbufError.append(strMsg);
                    }
                    break;
                case XmlPullParser.END_DOCUMENT:
                    m_bError = true;
                    m_strErrMsg = ERR_UNEXP_END;
                    throw new XmlPullParserException(ERR_UNEXP_END);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println(strXml);
    }
}


Реально работающий кусок кода. В начале там есть строка strXml, в ней тот XML, который этим кодом парсится.

Цитата

Еще вставил-таки проверку чтобы getText не был null, но ничего не дало.


В случае, если у тебя XML выглядит так:
Код

<form>
<crt>
...

между событиями START_TAG на <form> и <crt> будет еще событие TEXT. И на него метод parser.getText() выдаст не null, а символы переноса строки и перевода каретки, т.е. "\r\n".
PM MAIL WWW ICQ   Вверх
AncleFedor
Дата 21.8.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2008

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



Shushpanchik, спасибо, попробую. 

PM MAIL   Вверх
AncleFedor
Дата 22.8.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2008

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



Новости с полей. С кодом мидлета я пока не работал, но попробовал парсить разные структуры хмл. Так вот, когда хмл-файл скомпонован в одну строку (без пробелов, табов и переводов строк), моя ошибка пропадает, но появляется "Неожиданный конец файла". Т.е. мои выводы: kXML на сонериках невероятно капризен, нужно учитывать многое, в том числе и то, что kXML воспринимает перевод строки как событие типа TEXT.

Расследование продолжается...
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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