2013-04-11 35 views
11

Đang cố gắng kiểm tra kết nối Internet trong ứng dụng của tôi. Có một quy tắc ứng biểu hiện của tôi:Cuộc gọi của Người nhận phát sóng hai lần

<uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
     <receiver android:name=".MyReceiver" > 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
     </intent-filter> 
    </receiver> 

Và có một xử lý lớp:

public class MyReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    if(intent.getAction() != null && intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")); 
    { 
     Log.d("myLogs", "Network connectivity change"); 
     if (intent.getExtras() != null) { 
      NetworkInfo ni = (NetworkInfo) intent.getExtras().get(
        ConnectivityManager.EXTRA_NETWORK_INFO); 
      if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) { 
       Log.i("myLogs", "Network " + ni.getTypeName() + " connected"); 
      } 
     } 
     if (intent.getExtras().getBoolean(
       ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) { 
      Log.d("myLogs", "There's no network connectivity"); 
     } 
    } 
} 

}

Trong Logcat của tôi tôi nhận được một bức tranh giống như một:

04-11 23:24:48.021: D/myLogs(10261): Network connectivity change 
04-11 23:24:48.021: I/myLogs(10261): Network WIFI connected 
04-11 23:24:48.202: D/myLogs(10261): Network connectivity change 
04-11 23:24:48.202: I/myLogs(10261): Network WIFI connected 

Vì vậy, người nhận được gọi hai lần. Tại sao? Có một số vấn đề với tất cả các loại kết nối.

+0

Có thể có các cấp độ khác nhau được kết nối và 2 nhật ký của bạn là 2 tiểu bang khác nhau. Tôi muốn đăng xuất thêm thông tin để xem chúng khác nhau như thế nào. –

+0

Cố gắng đăng nhập 'nếu (netInfo! = Null && netInfo.isConnected()) { \t \t \t \t \t Log.i ("myLogs", "Mạng" + netInfo.getTypeName() + "được kết nối"); \t \t \t} ' Có ý kiến ​​cho rằng có hai tiểu bang - isConnecting và isConnected, nhưng cùng một vấn đề/ – Sunstrike

Trả lời

3

Giả sử bạn nhận được thông báo được kết nối khi kết nối wifi, tôi đoán là cái đầu tiên là đúng và 2 kia chỉ là tiếng vọng vì lý do nào đó.

Để biết rằng thư đã được gọi, bạn có thể có một boolean tĩnh được chuyển đổi giữa kết nối và ngắt kết nối và chỉ gọi các thường trình phụ khi bạn nhận được kết nối và boolean là đúng. Một cái gì đó như:

public class ConnectionChangeReceiver extends BroadcastReceiver { 
    private static boolean firstConnect = true; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     final NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
     if (activeNetInfo != null) { 
      if(firstConnect) { 
       // do subroutines here 
       firstConnect = false; 
      } 
     } 
     else { 
      firstConnect= true; 
     } 
    } 
} 

Note

Có hai điều bạn cần để xem cho. Đầu tiên - lưu trữ "firstConnect" ở đâu đó, ví dụ trong tùy chọn chia sẻ và thứ hai là khi bạn thay đổi từ 3G sang WiFi, không có ngắt kết nối thực sự, vì vậy Tốt hơn là xử lý các sự kiện 3G và WiFi riêng lẻ

+1

không làm việc cho tôi và là một bản sao của câu trả lời này http://stackoverflow.com/questions/8412714/broadcastreceiver-receive-multiple-same-messages-cho-một sự kiện/8413512 # 8413512 – DJphy

1

Bạn cũng có thể cần kiểm tra xem liệu ý định được nhận là một trong những sự kiện Chú ý bằng cách kiểm tra isStickyBroadcast trong người nhận của bạn hay không. Nếu điều đó là đúng, thì bạn có thể bỏ qua nó và tiếp tục. Bạn nhận được các chương trình phát sóng hấp dẫn ngay sau khi người nhận được đăng ký.

http://developer.android.com/reference/android/content/BroadcastReceiver.html#isInitialStickyBroadcast%28%29

0

Giải thích trong tài liệu:

"Changes để kết nối một thiết bị có thể rất thường xuyên -cái này phát sóng được kích hoạt mỗi khi bạn di chuyển giữa các dữ liệu di động và Wi-Fi Như một kết quả. , thực tiễn tốt là theo dõi chương trình phát sóng này khi bạn đã tạm dừng bản cập nhật hoặc tải xuống để tiếp tục lại chúng. Nói chung, bạn chỉ cần kiểm tra kết nối Internet trước khi bắt đầu cập nhật và không có kết nối được khôi phục. "

Chỉnh sửa: Quên thêm ... một người nhận phát sóng chỉ để biết liệu thiết bị có được kết nối là một chút của một đầu lơ lửng hay không. Từ cùng một tài liệu:

ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 
boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI; 
Các vấn đề liên quan