Шина событий вызывается каждый раз при создании Activity

Я написал NetworkStateReceiver для проверки состояния Интернета и публикации этого намерения в Activity через Event Bus.

    public class NetworkStateReceiver extends BroadcastReceiver {
    private static final String TAG = "NetworkStateReceiver";

    NetworkEvent networkEvent = null;

    @Override
    public void onReceive(final Context context, final Intent intent) {
        LogMe.e(TAG, "Network connectivity change");


        if (intent.getExtras() != null && intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {

            if (Connectivity.isConnected(context)) {
                LogMe.i(TAG, "Network " + Connectivity.getNetworkInfo(context) + " connected");
                networkEvent = new NetworkEvent(NetworkEvent.INTERNET_CONNECTED, true);

                EventBus.getDefault().post(networkEvent);
            } else {
                LogMe.i(TAG, "Network " + Connectivity.getNetworkInfo(context) + " not connected");
                networkEvent = new NetworkEvent(NetworkEvent.INTERNET_GONE, false);
                EventBus.getDefault().post(networkEvent);

            }
        }
    }
}

В действии я зарегистрировал шину событий onStart и отменил регистрацию в onPause.

@Override
protected void onResume() {
    super.onResume();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
    broadcastReceiver = new NetworkStateReceiverActivity();
    registerReceiver(broadcastReceiver, intentFilter);
}

@Override
protected void onDestroy() {
    super.onDestroy();
}

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
protected void onPause() {
    super.onPause();
    EventBus.getDefault().unregister(this);
    unregisterReceiver(broadcastReceiver);
}


@Subscribe(threadMode = ThreadMode.MAIN)
    public void onNetworkEvent(NetworkEvent event) {

        textView_internet.setText("" + event.isNetworkStateChanged());

        if (event.getTAG() == NetworkEvent.INTERNET_CONNECTED) {

            if (event.isNetworkStateChanged()) {

                LogMe.i(TAG, "Has Internet ....");

                Snackbar.make(getWindow().getDecorView().getRootView(), "Has internet ", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }

        } else if (event.getTAG() == NetworkEvent.INTERNET_GONE) {
            if (!event.isNetworkStateChanged()) {
                LogMe.i(TAG, "No Internet ....");

                Snackbar.make(getWindow().getDecorView().getRootView(), "No internet", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        }
    }

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


person Md Shihab Uddin    schedule 11.12.2017    source источник
comment
Пробовали ли вы не прописывать трансляцию для каждого Activity, а делать это в манифесте? Или, если вы хотите, чтобы это было в Activity, тогда сделайте какую-нибудь BaseActivity, которая расширит все ваши действия. Вы его там зарегистрируете, но только один раз (по какому-то условию).   -  person Tomas Ivan    schedule 11.12.2017
comment
Моя проблема: шина событий вызывается при создании активности. но мне нужно, когда событие запускается, как изменилось состояние Интернета.   -  person Md Shihab Uddin    schedule 11.12.2017


Ответы (1)


Хорошо, у нас есть пара вещей

  • Ваша реализация isNetworkStateChanged() не совсем корректна.

Потому что в основном каждый раз, когда ваша активность resumed, вы создаете новый экземпляр BroadcastReceiver, и для этого экземпляра первый раз всегда будет рассматриваться как изменение сети, даже если на самом деле это не так.

Вам нужно либо инициализировать BroadcastReceiver с текущим состоянием сети — в конструкторе получить текущее состояние сети и установить его по умолчанию — либо найти другой способ не получить ложное изменение при первой регистрации приемника.

  • Логика в BroadcastReceiver тоже не совсем верна. Вы рассматриваете возможность стать connected сетевым изменением, но быть not connected не сетевым изменением. Вам необходимо установить флаг изменения сети в зависимости от того, совпадает ли последнее подключенное состояние с тем, которое вы получаете, или нет.

По сути, вам нужно что-то вроде

new NetworkEvent(.., lastConnectionState == newConnectionState);
person elmorabea    schedule 11.12.2017