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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка СМС, Получение результата отправки СМС 
V
    Опции темы
RomkaRomka
Дата 27.11.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброе время суток!

Ситуация такая: в главной нити мидлета создается нить игры. Из нити игры по нажатии клавиши необходимо отправить СМС. На результате отправки основываются дальнейшие действия. Для этого перевожу текущую нить в режим ожидания, запускаю новую нить и в ней делаю отправку, по окончанию отправки пробуждаю нить игры. Проверил на телефонах (SE k800, SE k610, Nokia 6630, Samsung U600) - работает отлично. Проблема заключается в том, что на эмуляторе почему-то в режим ожидания переходит нить отправки сообщения (и мидлет зависает), вместо нити игры. И все бы ничего, но нашлось уже одно устройство, которое ведет себя так же как и эмулятор (SE k750). И вот теперь думаю - или мой код неправильный или... даже не знаю что подумать ещё.

В коде это выглядит так (код немудреный и его мало, поэтому комментарии не делал):

Код

// отправка СМС из нити игры
private void sendSMS()
{
    String url = "some url";
    String txt = "some txt";

    if (SMS.newSMS().send(url, txt))
    {
        doSomething1();
    }
    else
    {
        doSomething2();
    }
}


public class SMS
{
    private String url = "";
    private String txt = "";

    private boolean success = false;

    public static SMS newSMS()
    {
        return new SMS();
    }

    public SMS()
    {
        //
    }

    public String get_url()
    {
        return url;
    }

    public String get_txt()
    {
        return txt;
    }

    public synchronized boolean send(String url, String txt)
    {
        this.url = "sms://" + url;
        this.txt = txt;

        Sender.newSender().send(this);

        try
        {
            wait();
        }
        catch (Exception e)
        {
            //
        }

        return success;
    }

    public synchronized void done(boolean success)
    {
        this.success = success;

        notify();
    }

}


import javax.wireless.messaging.*;
import javax.microedition.io.*;
import java.lang.*;

public class Sender
    implements Runnable
{
    private SMS sms = null;

    private Thread thread = null;

    private boolean success = false;

    public static Sender newSender()
    {
        return new Sender();
    }

    public Sender()
    {
        //
    }

    public void send(SMS sms)
    {
        this.sms = sms;

        thread = new Thread(this);
        thread.start();
    }

    public void run()
    {
        MessageConnection connection = null;

        try
        {
            connection = (MessageConnection) Connector.open(sms.get_url());

            TextMessage message = (TextMessage) connection.newMessage("text");

            message.setPayloadText(sms.get_txt());

            connection.send(message);

            success = true;
        }
        catch (Exception e)
        {
            success = false;
        }
        finally
        {
            if (connection != null)
            {
                try
                {
                    connection.close();
                }
                catch (Exception e)
                {
                    //
                }
            }
        }

        sms.done(success);
    }

}


С уважением, Роман.
PM MAIL   Вверх
eugine_s
Дата 28.11.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



так вроде бы все нормально, тем более что на большинстве устройств работает? 

Может попробовать обойтись без засыпания? 

То есть твой основной поток игры (т.е. не сам поток (thread), а просто состояние игры) в состояние _ожидаю_отправки_смс_, а когда смс-ка будет отправлена sms-sender дернет метод, который скажет смс-ка отправлена или нет (и это метод переведет игру в нужно состояние)?


Что-нибудь типа вот такого:
Код


class Main implements Running 
{

...

void run() 
{
//основной поток игры
while (running) 
{
if (state == STATE_WAIT_SMS)
{
//do nothing
} else if (state == STATE_SEND_SMS) 
{
SMS.send();
state = STATE_WAIT_SMS;
}

}
}

public void smsResult(int result)
{
if (state == STATE_WAIT_SMS)
{
//смс отправлено
...

}
}

}





Так же это можно реализовать через интерфейс (какой-нибудь SmsListener)


PM MAIL   Вверх
RomkaRomka
Дата 28.11.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за участие!

Про такой вариант я думал, но хотелось сделать красивоsmile
Уже столько разных костыликов пришлось наставить...

Сейчас думаю поставить в вызове wait таймаут секунд 10-20 (надеюсь этого хватит чтоб успеть нажать да/нет) по истечении которого просто прибивать поток отправки смс... если получится.


С уважением, Роман.


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


Новичок



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

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



В общем сам дурак smile 

Не обратил внимания что SE k750 и эмулятор ведут себя все-таки по разному: эмулятор зависает сразу, даже не доходит до запроса подтверждения на отправку смс, а на теле зависало уже после подтверждения. Т.е. аппарат реально не мог отправить сообщение.

Оказалось, на телефонах код вполне работоспособный. Была проблема с симкой (мне неясная), на другой симке все заработало (хотя с первой симкой на других аппаратах тоже работало).

Так что проблема закрыта.



PM MAIL   Вверх
auf1r
Дата 23.1.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хай!

Вот где Ваша проблемма:

Код

public synchronized boolean send(String url, String txt)
    {
        this.url = "sms://" + url;
        this.txt = txt;

        Sender.newSender().send(this);  // <-------------- Здесь отделяется нить посылки СМС

        try
        {
            wait();    <------------------------ Если нить посылки СМС успела завершиться ДО прихода в эту точку(например Exception), имеем Клинч
        }
        catch (Exception e)
        {
            //
        }

        return success;
    }

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

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

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


 




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


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

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