2017-01-23 2 views
0

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_SERVICEgetActiveNetworkInfo(), 그런 일에 사용하도록 제안하고 있습니다 :

@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_INFOisConnected = truenetworkType = TYPE_WIFI이 될 것입니다. 그러나 연결 서비스에서 데이터를 가져올 때 onReceive이 비동기 적으로 호출되면 WiFi가 이미 연결이 끊어져 isConnected = falsenetworkType = TYPE_WIFI이 발생하고이 호출에 대한 올바른 값은 여전히 ​​onReceive입니다. 또는 이것은 항상 충분히 빠르며 연결 서비스에서 올바른 값을 얻을 수 있도록 onReceive ..?

답변

0

연결 상태가 위 또는 아래의 경우 별도의 추가, 방송마다 연결 변경을 전송 한 내 솔루션, 그것은 도움이되기를 바랍니다 :

public class ConnectivityChangeReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.i(context.getClass().getName(), " Changed connection "); 
    context.sendBroadcast(new Intent(MyApplication.ACTION_CONNECTION_CHANGED) 
      .putExtra(MyApplication.INTENT_EXTRA_CONNECTION_STATUS,NetWorkUtils.isNetworkAvailable(context))); 
}} 


public static boolean isNetworkAvailable(Context context) { 
    ConnectivityManager cm = 
      (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    return activeNetwork != null && 
      activeNetwork.isConnectedOrConnecting(); 
} 

안드로이드 매니페스트 : 그래서 다시

<receiver android:name=".ConnectivityChangeReceiver"> 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
    </receiver> 
+0

- 당신에게 보낸 인 텐트의 정보가 아닌 연결 서비스를 사용하고 있습니다. -> 그래서 질문이 남아 있습니다 (서비스의 정보가 항상 인 텐트의 정보와 같거나 경쟁 조건으로 인해이 정보가 달라질 수 있습니까?) – Guy

+0

잘 d에 따라 ocumentation 당신은 네트워크 상태를 알고 의도에 여분을 사용할 수 있지만 확실히 똑바로 앞으로 솔루션을 확인하기 위해 갔다. – AmirG

+0

CONNECTIVITY_ACTION에서 https://developer.android.com/reference/android/net/ConnectivityManager.html을 확인하십시오. – AmirG

관련 문제