2015-03-04 8 views
0

я не знаю, почему, когда я подключить или отключить Wi-Fi, соответствующий обратный вызов в ниже размещенном коде WiFi приемника, называется много раз, по крайней мере в три раза, иПочему onReceive() вызывается много раз?

поэтому, если я хочу назвать функция, основанная на текущем состоянии wifi, эта функция будет вызвана много раз, и я не хочу такого поведения, особенно в функции

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

, пожалуйста, используйте alok на ниже размещенном logcat, это просто пример того, что я получаю.

, пожалуйста, дайте мне знать, почему соответствующий обратный вызов статуса wifi вызывается много раз и как избежать такого множественного вызова?

код:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_activity); 

    tv_status = (TextView) findViewById(R.id.tv_status); 

    this.registerReceiver(this.myWifiReceiver, new IntentFilter(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)); 
} 

private BroadcastReceiver myWifiReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     Log.d(TAG, "@onReceive()"); 

     mConnMgr = (ConnectivityManager)getSystemService(network_service); 
     WifiManager wifiMgr = (WifiManager) context.getSystemService(WiFi_Service); 

     switch (wifiMgr.getWifiState()) { 
     case WifiManager.WIFI_STATE_ENABLED: 
      Log.d(TAG, "wifi enabled"); 

      if (mConnMgr != null) { 
       networkInfo = mConnMgr.getActiveNetworkInfo(); 
       if (networkInfo != null) { 
        switch(networkInfo.getType()) { 
        case ConnectivityManager.TYPE_WIFI: 
         if (networkInfo.isConnected()) { 
          tv_status.setText("Connected"); 
          Log.d(TAG, "Connected"); 
         }else if (networkInfo.isConnectedOrConnecting()) { 
          tv_status.setText("Status: CONNECTED Or CONNECTING"); 
          Log.d(TAG, "Status: CONNECTED Or CONNECTING"); 
         }else if (networkInfo.isFailover()){ 
          Log.d(TAG, "Status: FailOver"); 
         }else if (networkInfo.isRoaming()) { 
          Log.d(TAG, "Status: Roaming"); 
         }else if (networkInfo.isAvailable()) { 
          Log.d(TAG, "Status: Available"); 
         } else { 
          Log.d(TAG, "Status: disconnected"); 
         } 
         break; 

        } 
       }else { 
        tv_status.setText("Status: No Default NetWork Connected"); 
        Log.d(TAG, "Status: No Default NetWork Connected"); 
       } 
      } else { 
       tv_status.setText("Status: ConnMgr is null"); 
       Log.d(TAG, "Status: ConnMgr is null"); 
      } 

      break; 

LogCat:

03-04 15:31:31.031: D/MainActivity(16120): @onReceive() 
03-04 15:31:31.031: D/MainActivity(16120): wifi enabled 
03-04 15:31:31.032: D/MainActivity(16120): Status: No Default NetWork Connected 
03-04 15:31:31.546: D/MainActivity(16120): @onReceive() 
03-04 15:31:31.547: D/MainActivity(16120): wifi enabled 
03-04 15:31:31.547: D/MainActivity(16120): Status: No Default NetWork Connected 
03-04 15:31:31.617: D/MainActivity(16120): @onReceive() 
03-04 15:31:31.618: D/MainActivity(16120): wifi enabled 
03-04 15:31:31.620: D/MainActivity(16120): Status: No Default NetWork Connected 
03-04 15:31:31.636: D/MainActivity(16120): @onReceive() 
03-04 15:31:31.636: D/MainActivity(16120): wifi enabled 
03-04 15:31:31.637: D/MainActivity(16120): Status: No Default NetWork Connected 
03-04 15:32:28.661: D/MainActivity(16120): @onReceive() 
03-04 15:32:28.663: D/MainActivity(16120): wifi enabled 
03-04 15:32:28.666: D/MainActivity(16120): Status: No Default NetWork Connected 
03-04 15:32:28.708: D/MainActivity(16120): @onReceive() 
03-04 15:32:28.709: D/MainActivity(16120): wifi enabled 
03-04 15:32:28.710: D/MainActivity(16120): Status: No Default NetWork Connected 
03-04 15:32:28.722: D/MainActivity(16120): @onReceive() 
03-04 15:32:28.722: D/MainActivity(16120): wifi enabled 
03-04 15:32:28.722: D/MainActivity(16120): Status: No Default NetWork Connected 

Update_1:

MySolution с использованием таймера:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_activity); 

    tv_status = (TextView) findViewById(R.id.tv_status); 
    IntentFilter intfil = new IntentFilter(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 

    this.registerReceiver(this.myWifiReceiver, intfil); 
} 

private BroadcastReceiver myWifiReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     Log.d(TAG, "@onReceive()"); 
     Timer t1 = new Timer(); 
     Timer t2 = new Timer(); 

     if (!locked) { 
      if (scheduled1) { 
       t1.cancel(); 
       t1.purge(); 
      } 
      if (scheduled2) { 
       t2.cancel(); 
       t2.purge(); 
      } 

      WifiManager wifiMgr = (WifiManager) context.getSystemService(WiFi_Service); 

      switch (wifiMgr.getWifiState()) { 
      case WifiManager.WIFI_STATE_ENABLED: 
       Log.d(TAG, "wifi enabled"); 
       locked = true; 
       t1 = new Timer(); 
       t1.schedule(MQTTReceiverLockTimedTask, 4000); 
       scheduled1 = true; 
       module(); 
       break; 

      case WifiManager.WIFI_STATE_DISABLED: 
       Log.d(TAG, "wifi disabled"); 
       locked = true; 
       t2 = new Timer(); 
       t2.schedule(MQTTReceiverLockTimedTask, 4000); 
       scheduled2 = true; 
       break; 
      } 
     } 
    } 
}; 

TimerTask MQTTReceiverLockTimedTask = new TimerTask() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     locked = false; 
    } 
}; 

protected void module() { 
    // TODO Auto-generated method stub 
    mConnMgr = (ConnectivityManager)getSystemService(network_service); 

    if (mConnMgr != null) { 
     networkInfo = mConnMgr.getActiveNetworkInfo(); 
     if (networkInfo != null) { 
      switch(networkInfo.getType()) { 
      case ConnectivityManager.TYPE_WIFI: 
       if (networkInfo.isConnected()) { 
        tv_status.setText("Connected"); 
        Log.d(TAG, "Connected"); 
       }else if (networkInfo.isConnectedOrConnecting()) { 
        tv_status.setText("Status: CONNECTED Or CONNECTING"); 
        Log.d(TAG, "Status: CONNECTED Or CONNECTING"); 
       }else if (networkInfo.isFailover()){ 
        Log.d(TAG, "Status: FailOver"); 
       }else if (networkInfo.isRoaming()) { 
        Log.d(TAG, "Status: Roaming"); 
       }else if (networkInfo.isAvailable()) { 
        Log.d(TAG, "Status: Available"); 
       } else { 
        Log.d(TAG, "Status: disconnected"); 
       } 
       break; 

      } 
     }else { 
      tv_status.setText("Status: No Default NetWork Connected"); 
      Log.d(TAG, "Status: No Default NetWork Connected"); 
     } 
    } else { 
     tv_status.setText("Status: ConnMgr is null"); 
     Log.d(TAG, "Status: ConnMgr is null"); 
    } 
} 
+0

Показать код, с которого вы звоните в этот ресивер? – Apurva

+0

@Apurva смотрите, пожалуйста, выше, я отправил его – rmaik

ответ

2

Из WifiManager documentation на WifiManager.SUPPLICANT_STATE_CHANGED_ACTION:

Broadcast намерение действий, указывающих, что состояние установления соединения с точкой доступа имеет changed.One EXTRA обеспечивает новый SupplicantState.

Вы получаете много звонков в onReceive() потому что SupplicantState обеспечивает более подробную информацию о состоянии установления соединения. Каждый раз, когда это состояние изменяется, новое намерение транслируется. Поскольку вам нужна только менее подробная информация, кажется, что вы получаете такие же трансляции много раз.

Как о том, как этого избежать: либо искать другое намерение для прослушивания, например, ConnectivityManager.CONNECTIVITY_ACTION, если оно соответствует вашим потребностям, либо попробовать решение Mahmoud Elmorabea - сохранить текущее состояние подключения Wi-Fi в закрытом поле вашего класса Activity и на onReceive(), проверьте, изменилось ли состояние подключения. Если это не так, пропустите оставшуюся часть кода. В противном случае запустите код и обновите свой статус. Если вы используете это решение, не забудьте сохранить поле состояния во время жизненного цикла Activity.

1

Сохраняйте текущее состояние WiFi где-то, диспетчера или что-то еще, и выполняйте свой код только в том случае, если onReceive() вызывается с другим состоянием, чем текущее.

Предположим, вы используете этот код в Управлении.

В вашей деятельности у вас будет свойство currentWifiState и сначала оно равно -100; например

и в ресивере код идет как этого

if (wifiManager.getWifiState() == currentWifiState) 
    return; 

Тогда, если состояние вы уведомление с таким же, как текущим, вы ничего не будете делать.

Ваш код не будет выполнен, если состояние Wifi не изменится.

+0

, пожалуйста, уточните и уточните дальше? извините, я сделал nt получить вашу точку – rmaik

+0

проверить мой отредактированный asnwer – elmorabea

+0

, но почему существует несколько вызовов? любой ответ!! – rmaik

Смежные вопросы