在我們的應用程序中,我們希望能夠持續檢查連接狀態,如果發生故障,請拋出Toast或某種用戶界面來向用戶表明它已關閉。我嘗試在API調用時在我們的Retrofit Api-Builder類中執行此操作,但它似乎並不喜歡Toasts(導致崩潰)。Android - 監控互聯網連接狀態
iOS有監視功能,但它似乎在Android上,我們必須手動檢查。考慮到有多個活動等,在我們的應用程序中是否有簡單/乾淨的方法?
在我們的應用程序中,我們希望能夠持續檢查連接狀態,如果發生故障,請拋出Toast或某種用戶界面來向用戶表明它已關閉。我嘗試在API調用時在我們的Retrofit Api-Builder類中執行此操作,但它似乎並不喜歡Toasts(導致崩潰)。Android - 監控互聯網連接狀態
iOS有監視功能,但它似乎在Android上,我們必須手動檢查。考慮到有多個活動等,在我們的應用程序中是否有簡單/乾淨的方法?
這是我的表現如何監控網絡連接狀態。創建一個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更清潔的用戶界面。
您可以註冊將被告知連接更改的廣播接收器。
信息在Monitor for Changes in Connectivity
標題下。 https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html
使用廣播接收機,使得它觸發連接時發生改變
我已經研究過這一點,但沒有什麼是堅實的,當連接發生變化時它會告訴應用程序。當我嘗試將其實現到我的清單中時,「CONNECTIVITY_ACTION」不存在。我錯過了什麼? – svguerin3
您是否在清單文件中定義了接收器? –
我以前見過,但我不確定如何具體實現它。我在實施清單條目時看不到「CONNECTIVITY_ACTION」。 – svguerin3
從清單中隱式註冊的'CONNECTIVITY_ACTION'的api 24和up接收者不會被調用。因此,你應該通過'Context.registerReceiver'來完成。所有這些都在我在原始答案中鏈接的文檔中。 – TrevJonez