Android 앱에서 연결 상태 변경 사항을 모니터링하고 결정해야합니다.Android에서 연결 상태 변경을 감지 할 때 경쟁 조건이 발생합니다.
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(this, filter);
지금의 연결 상태를 결정하기 위해, 다음과 같은 작업을 수행 할 수 있습니다 :이를 위해, 나는 방송 수신기로 내 수업을 등록
@Override
public void onReceive(Context context, Intent intent) {
if (!ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
return;
}
NetworkInfo aNetworkInfo =
intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if (aNetworkInfo == null) {
return;
}
boolean isConnected = aNetworkInfo.isConnected();
int networkType = aNetworkInfo.getType();
// by using isConnected & networkType, get the new connectivity status..
}
문제는 ConnectivityManager.EXTRA_NETWORK_INFO가되지 않습니다 것입니다. 이제, 당신은 CONNECTIVITY_SERVICE
getActiveNetworkInfo()
, 그런 일에 사용하도록 제안하고 있습니다 :
@Override
public void onReceive(Context context, Intent intent) {
if (!ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
return;
}
ConnectivityManager connManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connManager == null) {
return;
}
NetworkInfo activeNetworkInfo = connManager.getActiveNetworkInfo();
boolean isConnected =
(activeNetworkInfo != null) && activeNetworkInfo.isConnected();
int networkType =
(activeNetworkInfo != null) ? activeNetworkInfo.getType() : -1;
// by using isConnected & networkType, get the new connectivity status..
}
이가 다음과 같은 질문 제기 : 2 구현에서
을의 CONNECTIVITY_SERVICE 및 하지 EXTRA_NETWORK_INFO를 사용하는 경우 :
경쟁 조건이 올 가능성이 있습니까? onReceive
은 연결 서비스에서 네트워크 정보를 가져올 때 비동기 적으로 호출되므로 연결 상태가 의도 된 네트워크 정보와 다를 수 있습니다 (연결이 변경 될 수 있음). 의도를 사용할 때 네트워크 정보에 onReceive
을 유발 한 데이터가 포함되어 있다고 확신하지만 서비스를 사용할 때 네트워크 정보가 다를 수 있습니다 ...?
그렇다면 onReceive
을 유발 한 정보를 얻는 가장 좋은 방법은 무엇입니까? 또한 그렇게 할 수있는 유일한 방법이 의도를 계속 사용하는 것이라면 - 2 가지 진실을 만들어 내지는 않습니까? (커넥티비티 서비스에서 하나 및 전송 의도 하나 ...)
:
가능한 경합 상태의 예 :
누군가 즉시 무선 접속 및 무선 랜에서 분리 . 그러면 2 개의 의도가 전송됩니다 (하나는 WiFi에 연결 용이고 다른 하나는 WiFi 연결 해제 용입니다. 실제로 더 많은 의도가 전송되지만이 두 가지에 초점을 맞 춥니 다). 내가 궁금해 할 수있는 경쟁 조건은 : 우리가 첫 번째 의도 (와이파이 연결)를 얻었을 때, 의도적 인 EXTRA_NETWORK_INFO
은 isConnected = true
과 networkType = TYPE_WIFI
이 될 것입니다. 그러나 연결 서비스에서 데이터를 가져올 때 onReceive
이 비동기 적으로 호출되면 WiFi가 이미 연결이 끊어져 isConnected = false
과 networkType = TYPE_WIFI
이 발생하고이 호출에 대한 올바른 값은 여전히 onReceive
입니다. 또는 이것은 항상 충분히 빠르며 연결 서비스에서 올바른 값을 얻을 수 있도록 onReceive
..?
- 당신에게 보낸 인 텐트의 정보가 아닌 연결 서비스를 사용하고 있습니다. -> 그래서 질문이 남아 있습니다 (서비스의 정보가 항상 인 텐트의 정보와 같거나 경쟁 조건으로 인해이 정보가 달라질 수 있습니까?) – Guy
잘 d에 따라 ocumentation 당신은 네트워크 상태를 알고 의도에 여분을 사용할 수 있지만 확실히 똑바로 앞으로 솔루션을 확인하기 위해 갔다. – AmirG
CONNECTIVITY_ACTION에서 https://developer.android.com/reference/android/net/ConnectivityManager.html을 확인하십시오. – AmirG