2017-08-10 156 views
1

在我們的應用程序中,我們希望能夠持續檢查連接狀態,如果發生故障,請拋出Toast或某種用戶界面來向用戶表明它已關閉。我嘗試在API調用時在我們的Retrofit Api-Builder類中執行此操作,但它似乎並不喜歡Toasts(導致崩潰)。Android - 監控互聯網連接狀態

iOS有監視功能,但它似乎在Android上,我們必須手動檢查。考慮到有多個活動等,在我們的應用程序中是否有簡單/乾淨的方法?

回答

0

這是我的表現如何監控網絡連接狀態。創建一個Java類並將其命名爲NetworkStateChangeReceiver

NetworkStateChangeReceiver

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.support.v4.content.LocalBroadcastManager; 
import android.util.Log; 
import static android.content.Context.CONNECTIVITY_SERVICE; 

public class NetworkStateChangeReceiver extends BroadcastReceiver { 
public static final String NETWORK_AVAILABLE_ACTION = "yourapp.packagename.NetworkAvailable"; 
public static final String IS_NETWORK_AVAILABLE = "isNetworkAvailable"; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Intent networkStateIntent = new Intent(NETWORK_AVAILABLE_ACTION); 
    networkStateIntent.putExtra(IS_NETWORK_AVAILABLE, isConnectedToInternet(context)); 

LocalBroadcastManager.getInstance(context).sendBroadcast(networkStateIntent); 
} 

private boolean isConnectedToInternet(Context context) { 
    try { 
     if (context != null) { 
      ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
      return networkInfo != null && networkInfo.isConnected(); 
     } 
     return false; 
    } catch (Exception e) { 
     Log.e(NetworkStateChangeReceiver.class.getName(), e.getMessage()); 
     return false; 
    } 
} 
} 

在您的MainActivity,添加以下代碼行。

IntentFilter intentFilter = new 
IntentFilter(NetworkStateChangeReceiver.NETWORK_AVAILABLE_ACTION); 
    LocalBroadcastManager.getInstance(this).registerReceiver(new 
BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      boolean isNetworkAvailable = intent.getBooleanExtra(IS_NETWORK_AVAILABLE, false); 
      String networkStatus = isNetworkAvailable ? "Connected!" : "Disconnected!"; 

      final SweetAlertDialog CC = new SweetAlertDialog(MainActivity.this, SweetAlertDialog.WARNING_TYPE); 
      CC.setTitleText("Network Status"); 
      CC.setContentText(networkStatus); 
      CC.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); 
      CC.setCancelable(false); 
      CC.show(); 

您可以使用簡單的alertdialog或toast來顯示消息。我已經使用了SweetAlertDialog Library更清潔的用戶界面。

0

您可以註冊將被告知連接更改的廣播接收器。

信息在Monitor for Changes in Connectivity標題下。 https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html

+0

我以前見過,但我不確定如何具體實現它。我在實施清單條目時看不到「CONNECTIVITY_ACTION」。 – svguerin3

+0

從清單中隱式註冊的'CONNECTIVITY_ACTION'的api 24和up接收者不會被調用。因此,你應該通過'Context.registerReceiver'來完成。所有這些都在我在原始答案中鏈接的文檔中。 – TrevJonez

0

使用廣播接收機,使得它觸發連接時發生改變

+0

我已經研究過這一點,但沒有什麼是堅實的,當連接發生變化時它會告訴應用程序。當我嘗試將其實現到我的清單中時,「CONNECTIVITY_ACTION」不存在。我錯過了什麼? – svguerin3

+0

您是否在清單文件中定義了接收器? –