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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> программка для отсылки сообщении, прошу поправить 
:(
    Опции темы
sergeytar
Дата 4.4.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравсвуйте!
Я только начинающий...........

Опираясь на статью http://www.mobilab.ru/articles/88/ написал программку для отсылки сообщении. Она запрашивает некоторые данные, вставляет их в сообщение и отправляет на определенный номер.
Код

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.wireless.messaging.*;

public class mplat extends MIDlet
    implements CommandListener, ItemCommandListener{

    private Display display;
    private Form LogoForm, Form;
    public mplat ()     {}
    private TextField TFNomer,TFKont;

    //Создаем комманды
    private Command CMD_FIRST = new Command("Отправить", Command.SCREEN, 1); 
    private Command CMD_START = new Command("OK", Command.SCREEN, 1); 
    private Command CMD_BACK = new Command("Назад", Command.BACK, 1); 
    private Command CMD_EXIT = new Command("Выход", Command.EXIT, 1); 

    protected void destroyApp( boolean unconditional ) throws  MIDletStateChangeException 
     {
       exitApp(); // вызывает уборщик мусора
      }

    protected void pauseApp(){}

    protected void startApp() throws MIDletStateChangeException
     {
         if( display == null )
              { 
                  initApp(); 
              }  
     }

    private void initApp()    //Этот метод выполняется при запуске мидлета
     {
         display = Display.getDisplay( this );
         LogoForm=new Form("Ввод реквизитов"); //Создаем первую форму
         LogoForm.setCommandListener(this);
         //Размещаем на ней поля для ввода текста
            TFNomer=new TextField("Номер","",5,TextField.NUMERIC);
            TFKont=new TextField("Сообщение","",100,TextField.ANY); 
            //Добавляем команды
            LogoForm.append(TFNomer);
            LogoForm.append(TFKont);
    //Добавляем подэкранные кнопки
        LogoForm.addCommand(CMD_FIRST);
        LogoForm.addCommand(CMD_EXIT);
    //Объявляем обработчик команд
        display.setCurrent(LogoForm);

     }    
   
    public void exitApp()
     {
         notifyDestroyed(); // уничтожение MIDlet-а
     }
    
    public void commandAction(Command c, Item item) {
    }

    public void commandAction(Command c, Displayable d) {
        if (c == CMD_FIRST) {    //Команда: Подтвердите
           //Создаем форму
            Form firstForm=new Form("Подтвердите...");
            firstForm.append("Для абонента: "+TFNomer.getString()+"\nСообщение: "+TFKont.getString());//Выводим текст
            //Добавляем команды
            firstForm.addCommand(CMD_START);
            firstForm.addCommand(CMD_BACK);
            firstForm.setCommandListener(this);
            //Делаем окно формы видимым        
            display.setCurrent(firstForm);
        }
        if (c == CMD_START)
        {//Команда об отправке
    try   
    {
    String addr = "sms://000";
    MessageConnection conn = (MessageConnection) Connector.open (addr);
    TextMessage msg = (TextMessage)conn.newMessage 
    (MessageConnection.TEXT_MESSAGE);
    msg.setPayloadText (TFNomer.getString()+": "+TFKont.getString());
    conn.send (msg);
    } 
    catch (Exception e) {}      

        initApp();//??????????

              }
        if (c == CMD_BACK) Display.getDisplay(this).setCurrent(LogoForm);
        if (c == CMD_EXIT){exitApp();}    //Команда "Выход"
   } 
}

Вопросы:
1. После отправки первого сообщения я возвращаю на главную страницу через initApp(); При вводе новых данных (или тех же, не важно) она больше не отправляет, т.е. перескакивает
Код
try   
    {
    String addr = "sms://000";
    MessageConnection conn = (MessageConnection) Connector.open (addr);
    TextMessage msg = (TextMessage)conn.newMessage 
    (MessageConnection.TEXT_MESSAGE);
    msg.setPayloadText (TFNomer.getString()+": "+TFKont.getString());
    conn.send (msg);
    } 
    catch (Exception e) {}

2. При непосредственной отправке сообщения на экран возвращается форма "Подтвердите...". Хотелось бы, чтобы отображалось типа "Подождите, отправка сообщения...". Пробовал после команды об отправке создать новую форму "Подождите...", но не реагирует.
PM MAIL   Вверх
nagliyvred
Дата 4.4.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



1. Вероятно вы не закрыли соединение и в блоке try возникает IOException "connection already opened" но вы его игнорируете в catch. Нужно вызвать conn.close() .
2. не реагирует или сразу же сменяется на другую форму(ту которая в initApp() ?)
PM   Вверх
Samuil
Дата 4.4.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в(Job)ываю
**


Профиль
Группа: Участник
Сообщений: 705
Регистрация: 26.4.2006
Где: Uzbekistan.Tashke nt

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



nagliyvred, Странно, но такая же проблемма с приложениями, которые коннектятся к серверу через мидлет. Первый раз все ок, а второй нефига smile Похоже это баг языка?


--------------------
Выбор уже сделан, остается его только осознать   
smile    smile 
      smile  

user posted image
PM MAIL ICQ   Вверх
W0LF
Дата 4.4.2007, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Цитата

1. После отправки первого сообщения я возвращаю на главную страницу через initApp(); При вводе новых данных (или тех же, не важно) она больше не отправляет, т.е. перескакивает

nagliyvred написал верно!
Цитата

Опираясь на статью http://www.mobilab.ru/articles/88/ 

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

Ниже приведен пример, создающий клиентское SMS соединение.
---
import javax.microedition.io.*;
import javax.wireless.messaging.*;

.....

MessageConnection conn = null;
String url = "sms://+417034967891";

try {
    conn = (MessageConnection) Connector.open( url );
    // делаем что-нибудь с соединением
}
catch( Exception e ){
    // Если произошла ошибка
}
finally {
    if( conn != null ){
        try { conn.close(); } catch( Exception e ){}
    }
}

Как мы видим, там есть блок finally, который срабатывает независимо от того, было исключение или нет. Так вот в нем и закрывается соединение
Цитата(nagliyvred @  4.4.2007,  13:21 Найти цитируемый пост)
2. не реагирует или сразу же сменяется на другую форму(ту которая в initApp() ?) 

Я так понял, что имелось ввиду вместо запроса на разрешение отправки поставить другое окно "Подождите".
нужно подписывать мидлет, чтоб "Подтвердите..." не было


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
nagliyvred
Дата 4.4.2007, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Samuil @ 4.4.2007,  22:13)
nagliyvred, Странно, но такая же проблемма с приложениями, которые коннектятся к серверу через мидлет. Первый раз все ок, а второй нефига smile Похоже это баг языка?

В языке нет багов. Баги могут быть в его реализации. А не закрыть за собой соединение это ошибка программиста. Если правильно реализовать работу с Connection'ами то все будет работать, пусть и нестабильно на глюкавых девайсах
PM   Вверх
Dancer
Дата 5.4.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nagliyvred @  4.4.2007,  23:50 Найти цитируемый пост)
В языке нет багов. Баги могут быть в его реализации. А не закрыть за собой соединение это ошибка программиста. Если правильно реализовать работу с Connection'ами то все будет работать, пусть и нестабильно на глюкавых девайсах 

5+
Подписываюсь под каждым словом!!! (Комрад, я с тобой! smile)) )


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


Новичок



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

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



Как это нужно закрыть? Так?
Код

try   
    {
    String addr = "sms://000";
    MessageConnection conn = (MessageConnection) Connector.open (addr);
    TextMessage msg = (TextMessage)conn.newMessage 
    (MessageConnection.TEXT_MESSAGE);
    msg.setPayloadText (TFNomer.getString()+": "+TFKont.getString());
    conn.send (msg);
    } 
    catch (Exception e) {}

    finally {
        if( conn != null ){
            try { conn.close(); } catch( Exception e ){}
        }
    }

Что-то не получается. Ошибки выдает
Код

C:\WTK20\apps\mplat\src\mplat.java:94: cannot resolve symbol
symbol  : variable conn 
location: class mplat

        try { conn.close(); } catch( Exception e ){}
                ^
1 error
com.sun.kvem.ktools.ExecutionException
Build failed

PM MAIL   Вверх
Dancer
Дата 5.4.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а если вот так?
Код


MessageConnection conn = null;
try   
    {
    String addr = "sms://000";
    conn = (MessageConnection) Connector.open (addr);
//... далее весь твой код



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


Новичок



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

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



Да smile, теперь получилось. Спасибо!smile 
А с другим вопросом не подскажите. 
Цитата

не реагирует или сразу же сменяется на другую форму(ту которая в initApp() ?)
Кажется не реагирует. После формы "Подтвердите..." телефон спрашивает можно ли отправить сообщение. И после этого здесь она зависает (на этой форме "Подтвердите...") на время отправки смс.

Это сообщение отредактировал(а) sergeytar - 5.4.2007, 17:58
PM MAIL   Вверх
Dancer
Дата 5.4.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а если скопировать именно то что написал я? smile))
Ну посмотри на строчки и найди САМ, одно отличие.

Тебе же пишется, что у тебя уже определена переменная с именем conn в методе commandAction().  покажи метод commandAction() целиком, как он у тебя сейчас реализован.


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


Шустрый
*


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

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



Цитата(sergeytar @ 5.4.2007,  17:41)
 И после этого здесь она зависает (на этой форме "Подтвердите...") на время отправки смс.

Зависает на время отправки смс а потом на экран-таки устанавливается форма из initApp() ? Тогда могу предположить что при вызове Connector.open() телефон вызывает окно подтверждения отправки, и когда отправка подтверждена не убирает эту форму с экрана до следующего вызова display.setCurrent(). Как вариант можно запихнуть отправку смс в отдельный поток а в главном поставить форму "подождите"  если она уже не стоит на экране и ждать пока смс не отправится. Приблизительно так:

Код

// class variables
private boolean sent;

public void commandAction(Command c , Displayable d)
{
//....
sent = false;
new Thread()
{

    public void run()
   {
          // Ваш код отправки смс

          /// когда смс отправлена выставляем флаг
          sent = true;
    } 
}.start();


// formWaiting - форма "подождите"
while (!sent)
{
     if (!display.getCurrent().equals(formWaiting))
         display.setCurrent(formWaiting);
     try 
     {
            Thread.currentThread().sleep(100): 
      } catch (InterruptedException ie) { }
}
///...



PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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