Android Сломанный код отправки SMS - PullRequest
0 голосов
/ 16 февраля 2012

Хорошо, я создаю приложение для Android, которое может отправлять SMS-сообщения несколько раз с интервалами между отправками сообщений. Это частично работает, но иногда нет. Например, когда я ввожу 20 сообщений для отправки, отправляется 16 или, может быть, немного больше. Кроме того, когда я нажимаю кнопку, она зависает, пока не завершит отправку SMS. Есть ли там кто-нибудь, кто может сказать мне, что не так с моим кодом? Я попробовал несколько исправлений, которые работают не очень хорошо, и думал, что приду сюда за помощью после многих неудачных попыток. PS Существует больше кода, чем это, но это проблема, я верю. Спасибо за прочтение РЕДАКТИРОВАТЬ: ИСПРАВЛЕНО!

1 Ответ

1 голос
/ 16 февраля 2012

Кнопка «зависает», потому что поток пользовательского интерфейса отправляет все 20 SMS, прежде чем он освобождается, чтобы заняться другими делами.

Я бы посмотрел на AsyncTask .Это способ Android легко нарезать нить.По сути, что бы вы сделали, это породило новый поток в фоновом режиме с AsyncTask.Это освобождает поток пользовательского интерфейса, так что все выглядит нормально для пользователя (без остановки), в то время как AsyncTask выполняет всю работу в фоновом режиме с doInBackground.Затем, когда задание выполнено, используйте onPostExecute, чтобы уведомить пользовательский интерфейс о том, что оно выполнено, и, возможно, что-то сказать пользователю.Вы бы поместили вызов на MyAsyncTask.execute(smsDataHere) в onClick.

Эта ссылка на AsyncTask довольно проста для простых целей и имеет пример кода.

Я не совсем уверен, почему он отправляет только 16 или около того сообщений, но я сразу вижу, что вам не хватает фигурных скобок, и что они не совсем совпадают с желаемыми.Я бы посмотрел там первым.Кроме того, есть ли причина для второго цикла for?size всегда равен 1, поэтому он просто посылает каждое сообщение дважды.

РЕДАКТИРОВАТЬ: Вот пример кода.Я не собираюсь обещать, что это работает в вашем конкретном приложении, но оно покажет вам, как работает AsyncTask, и даст вам отправную точку.Я также попытался исправить любые проблемы с фигурными скобками и сделал небольшую уборку.Я все еще рекомендую просмотреть документацию, чтобы убедиться, что вы понимаете, как она работает.Я надеюсь, что это поможет вам.

public void onClick(View v){                
    String phoneNo = putpn.getText().toString();
    String message = txtMessage.getText().toString();
    String txts = txtAmount.getText().toString();
    String inter = interval.getText().toString();

    if (msgCount > 21){
        Toast.makeText(getBaseContext(), "That is too many txts, the max is 20", Toast.LENGTH_SHORT).show();
    }
    else{
        MySmsTask.execute(phoneNo, message, txts, inter);
    }
}

private class MySmsTask extends AsyncTask<String, Void, Integer> {
    @Override
    protected Integer doInBackground(String... messageData) {
        int sentCount = 0;
        int size = 1;
        int delay = Integer.parseInt(messageData[3]);
        int msgCount = Integer.parseInt(messageData[2]);

        if (phoneNo.length()>0 && message.length()>0){
            for (sentCount = 0; sentCount < msgCount; sentCount++) {
                for (int i = 0; i < size; i++) {
                    sendSMS(messageData[0], messageData[1]);
                    Thread.sleep(delay * 1000);
                }
            }
        }
        return sentCount;
    }

    @Override
    protected void onPostExecute(Integer result) {
        Toast.makeText(getBaseContext(), "Sent " + sentCount + " messages", Toast.LENGTH_SHORT).show();
    }
}

private void sendSMS(String phoneNumber, String message){        
    PendingIntent pi = PendingIntent.getActivity(this, 0,
            new Intent(this, Object.class), 0);
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, message, null, null);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...