Тост отображается дважды

#java #android

#java #Android

Вопрос:

У меня есть программа, которая отправляет предопределенные текстовые сообщения группе людей одним нажатием кнопки. У меня это работает хорошо, но проблема в том, что когда он отправляет сообщения, он появляется с 2 тостами на каждое отправленное сообщение. Код:

 package com.mfd.alerter;

//imports

public class homeScreen extends Activity {

//buttons

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //vars

    // Grab the time
    final Date anotherCurDate = new Date();  
    SimpleDateFormat formatter = new SimpleDateFormat("km");  
    final String formattedTime = formatter.format(anotherCurDate);

    // Contacts
    final String[] numbers = getResources().getStringArray(R.array.numbers);

    // Start messages. Only 1 is given to shorten post
    callStructureFire.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            String msgText = "MFD PAGE OUT:nStructure FirenTimeout:" formattedTime;
            for (int i = 0; i < numbers.length; i  ) {
                sendSMS(numbers[i], msgText);
            }
        }
    });

    //more call types. not important.
}

//---sends a SMS message to another device---
private void sendSMS(String numbers, String message)
{           
    String SENT = "SMS_SENT";

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
        new Intent(SENT), 0);


    //---when the SMS has been sent---
    registerReceiver(new BroadcastReceiver(){
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode())
            {
                case Activity.RESULT_OK:
                    Toast.makeText(getBaseContext(), "SMS sent", 
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    Toast.makeText(getBaseContext(), "Generic failure", 
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    Toast.makeText(getBaseContext(), "No service", 
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    Toast.makeText(getBaseContext(), "Null PDU", 
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    Toast.makeText(getBaseContext(), "Radio off", 
                            Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }, new IntentFilter(SENT));

    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(numbers, null, message, sentPI, null);               
}  

//action bar stuff. not important.

}
  

Более подробно: допустим, я отправляю текст 3 людям, появится 6 всплывающих сообщений с надписью «Отправлено SMS». Как мне сделать так, чтобы отображалось только 3?

Кроме того, есть ли способ, возможно, добавить счетчик отправленных сообщений? Например: «Отправлено сообщение 1/10», «Отправлено сообщение 2/10» и т. Д.?

Ответ №1:

Я действительно не смотрел на ваш код и не спрашивал себя, почему это происходит, но вот трюк, чтобы тосты не появлялись дважды:

Создайте экземпляр Toast с помощью makeToast(), прежде чем показывать его, вы вызываете cancel() , устанавливаете текст, а затем вызываете show() . Это приведет к отклонению предыдущего тоста. Вы даже не заметите, что тост отображается дважды.

Это глупый обходной путь, но он работает для меня 😉

Ответ №2:

Разве вы не должны регистрировать получателя только один раз, а не каждый раз, когда вы вызываете sendSMS. Вы получаете 6 тостов с тремя sms-сообщениями, потому что у вас есть 3 широковещательных получателя. Итак, при первом запуске вы получаете 1 тост. Во втором запуске вы получаете 2 тоста (вызывается приемник, который был зарегистрирован в первом запуске, и тот, который был зарегистрирован во втором). При третьем запуске вызываются все три получателя, поэтому вы получаете еще три тоста. Всего в сумме — 6 тостов…

итак, я думаю, вам нужно зарегистрировать только одного получателя перед циклом for, в котором вы вызываете sendSMS, или, если вы хотите зарегистрировать в sendSMS, тогда вам нужно отменить регистрацию в конце метода.

Я надеюсь, что это поможет, приветствия!

Комментарии:

1. (Я новичок в программировании на Java / Android, так что будьте терпеливы со мной в терминах.) Можете ли вы показать мне, о какой части вы говорите, и возможное исправление? Я не уверен, о чем вы говорите.

2. (После выполнения нескольких быстрых тестов) Я верю, что вы правы в своем ответе, хотя каждый раз, когда я добавляю контакт, он увеличивается в геометрической прогрессии.

3. Пока это не решено полностью. Все еще пытаюсь выяснить, как остановить цикл приемника.

4. ооо .. просто извлеките метод registerReceiver и всю реализацию BroadcastReceiver из метода sendSMS и поместите его перед callStructureFire.setOnClickListener(новый вид. OnClickListener() …. Это должно выполнить свою работу…

5. Спасибо. Это сработало. Будет намного лучше знать, что мой телефон не будет бодрствовать в течение 10 минут, чтобы я случайно не нажал еще одну кнопку, lol.