Обновлять ListView каждую секунду, когда обработчик не работает

В моем приложении, где приложение получает новое sms-сообщение, я хочу, чтобы список немедленно обновлял его новым сообщением, отображаемым в списке. Я попытался использовать пример кода кода широковещательного приемника, но это не сработало, поэтому теперь я пытаюсь использовать таймер для обновления списка каждую секунду и отображения последнего полученного сообщения, но это тоже не работает.

 final Handler handler = new Handler();
                handler.postDelayed(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        inboxArrayAdapter.notifyDataSetChanged();

                        ((BaseAdapter)inboxmessages.getAdapter()).notifyDataSetChanged();

                        handler.postDelayed(this,  1000 );

                    }
                }, 1000);

        return view;

Первоначальная попытка использования BroadcastReceiver для обновления списка при получении нового SMS-сообщения.

SmSBroadcastReceiver.java

public class SmsBroadcastReceiver extends BroadcastReceiver
{
    public static final String SMS_BUNDLE = "pdus";

    // https://javapapers.com/android/android-receive-sms-tutorial/
    public void onReceive(Context context, Intent intent)
    {
        Bundle intentExtras = intent.getExtras();
        if (intentExtras != null)
        {
            Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
            String smsMessageStr = "";

            for (int i = 0; i < sms.length; i++)
            {
                // Get sms message
                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);

                // Get content and number
                String smsBody = smsMessage.getMessageBody().toString();
                String address = smsMessage.getOriginatingAddress();

                // Create display message
                smsMessageStr += "SMS From: " + address + "\n";
                smsMessageStr += smsBody + "\n";

                // Add it to the list
                CommandsFragment inst = CommandsFragment.instance();
                inst.updateList(smsMessageStr);
            }
            CommandsFragment inst = CommandsFragment.instance();
            inst.updateList(smsMessageStr);
        }
    }
}

CommandsFragment.java

 public static CommandsFragment instance()
        {
            return inst;
        }


        @Override
        public void onStart() {
            super.onStart();
            inst = this;
        }


        public static CommandsFragment newInstance()
        {
            CommandsFragment fragment = new CommandsFragment();
            return fragment;
        }

 public void updateList(final String smsMessage)
    {
        inboxArrayAdapter.insert(smsMessage, 0);
        inboxArrayAdapter.notifyDataSetChanged();
    }

Как насчет того, чтобы добавить ведение журнала, чтобы узнать, запускается ли когда-либо ваш обработчик? Кроме того, вы можете захотеть исправить форматирование вашего кода.

Ellen Spertus 08.04.2019 06:55

Да, не делай этого. Вместо этого заставьте приемник работать.

Mike M. 08.04.2019 06:58

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

Sahil Bora 08.04.2019 06:58

Поместите код обновления списка в метод и вызовите этот метод из широковещательного приемника onReceive. Это определенно сработает. Также проверьте код, правильно ли вы обновляете представление списка.

sam 08.04.2019 06:59

Я только что обновил вопрос своим кодом моей попытки кода широковещательного приемника.

Sahil Bora 08.04.2019 07:02

Вы уверены, что в наборе данных есть какое-то обновление?

Vladyslav Matviienko 08.04.2019 07:03

Используйте @override для onReceive.

sam 08.04.2019 07:04

Да, в наборе данных есть обновление, потому что, когда я меняю экраны, список будет обновлен последним полученным смс-сообщением.

Sahil Bora 08.04.2019 07:04

Я вставил @override для onReceive в SmsBroadcastReceiver.java, но все еще не обновлял список при получении нового SMS

Sahil Bora 08.04.2019 07:08

где вы регистрируете свой ресивер

Manoj Perumarath 08.04.2019 07:28

Приемник находится в другом файле класса с именем SmSBroadcastReceiver.java.

Sahil Bora 08.04.2019 07:29
1
11
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поместите код обновления списка внутри метода в действии, которому принадлежит список, и вызовите этот метод из onReceive приемника вещания. Это определенно сработает. Также проверьте код, правильно ли вы обновляете представление списка.

public class SmsBroadcastReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context paramContext, Intent intent) { // change the parameters depending upon your requirements

    // do something here with the sms received if necessary

    // then call the listview update method here        
   }

}

У меня уже есть этот код, взгляните на код CommandsFragment.java, который я выделил жирным шрифтом. В примере кода я получаю содержимое sms и обновляю список

Sahil Bora 08.04.2019 07:16

Вы пытались войти в метод, чтобы проверить, достигает ли вызов метода?

sam 08.04.2019 07:19

Я поместил тег журнала в метод onReceive и проверил свой вывод отладки в Android Studio, я не думаю, что он достигает его.

Sahil Bora 08.04.2019 07:34

Тогда как вы говорите, что получили смс? Вы получаете смс только через приемник!

sam 08.04.2019 07:50

Потому что, когда я перехожу к другому фрагменту или снова открываю приложение, список обновляется последним полученным смс.

Sahil Bora 08.04.2019 07:52

Также, чтобы добавить к ответу, не забудьте указать это ниже в файле AndroidManifest.xml.

  </activity>
        <receiver android:name = ".SmsBroadcastReceiver">
            <intent-filter>
                <action android:name = "android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>

Это выше также исправило решение для меня. Спасибо за помощь ребята.

Другие вопросы по теме