Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Отправка СМС


Автор: RomkaRomka 27.11.2008, 20:42
Доброе время суток!

Ситуация такая: в главной нити мидлета создается нить игры. Из нити игры по нажатии клавиши необходимо отправить СМС. На результате отправки основываются дальнейшие действия. Для этого перевожу текущую нить в режим ожидания, запускаю новую нить и в ней делаю отправку, по окончанию отправки пробуждаю нить игры. Проверил на телефонах (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);
    }

}


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

Автор: eugine_s 28.11.2008, 16:32
так вроде бы все нормально, тем более что на большинстве устройств работает? 

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

То есть твой основной поток игры (т.е. не сам поток (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)


Автор: RomkaRomka 28.11.2008, 17:24
Спасибо за участие!

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

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


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


Автор: RomkaRomka 1.12.2008, 18:52
В общем сам дурак smile 

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

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

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



Автор: auf1r 23.1.2009, 17:21
Хай!

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

Код

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;
    }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)