я не знаю, почему, когда я подключить или отключить 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");
}
}
Показать код, с которого вы звоните в этот ресивер? – Apurva
@Apurva смотрите, пожалуйста, выше, я отправил его – rmaik