2017-12-11 21 views
0

私は、チェックインターネット状態のためにNetworkStateReceiverを作成しました。&は、イベントバスを介してアクティビティにそのインテントを公開します。活動でアクティビティが発生するたびにイベントバスが呼び出される

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

      } 
     } 
    } 
} 

私は onPause にイベントバスONSTART未登録を登録。

@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を呼びたいと思います。それをどのように取り除くのですか?私はまた、活動の放送受信機でのみテストしたが、活動が作成されるたびに放送が受信された。

+0

は、各活動のための放送を登録しないようにしようとしましたが、マニフェストにそれを行いますか?または、アクティビティに追加する場合は、すべてのアクティビティを拡張する「BaseActivity」を実行します。あなたはそこにそれを登録しますが、一度だけ(条件によって)登録します。 –

+0

私の問題:アクティビティが作成されたときに呼び出されるイベントバス。しかし、私はインターネットの状態が変更されたようなイベントが発生したときに必要です。 –

答えて

0

さて、物事のカップルは、我々がここにある

  • isNetworkStateChanged()の実装では、完全に正しいではありませんがあります。

基本的に、あなたの活動がresumedあるたびに、あなたは新しいBroadcastReceiverインスタンスを作成し、このインスタンスの、最初の時間は常にそれが実際にはそうではなかった場合でも、ネットワークの変化として見られることになるので。

BroadcastReceiverを現在のネットワーク状態で初期化する必要があります。コンストラクタで現在のネットワーク状態を取得し、デフォルトに設定するか、受信者を初めて登録するときに誤った変更をしないでください。

  • BroadcastReceiverのロジックも完全に正しいわけではありません。あなたはネットワークの変更としてnot connectedであるのに対して、connectedはネットワークの変更と考えています。最後に接続された状態が取得した状態と同じであるかどうかに応じて、ネットワーク変更フラグを設定する必要があります。

基本的に、あなたは何かなどを必要とする、

new NetworkEvent(.., lastConnectionState == newConnectionState); 
関連する問題