2013-09-28 38 views
2

我的Android應用程序是高度依賴於互聯網連接。最佳實踐,用於處理網絡可用性

這是一個Internetradio應用程序。 MainActivity顯示當前的信息,例如是否有dj播放或播放列表(並不時刷新其數據)。

也有兩個活動,顯示從互聯網(曲目列表和即將到來的節目)更多的數據。

目前,我有我的mainactivity啓動檢查在那裏我測試,如果無線網絡,移動或WiMAX連接,如果沒有連接i顯示了一條消息,並退出該應用程序。

,但我覺得與真不好。首先,我認爲關閉應用程序不是一個好主意,而且支票也是一次。所以如果我打開應用程序,然後打開飛機模式的應用程序繼續運行,並試圖更新數據 - >故障...

我現在需要的是一個建議如何我可以改進「我在線」測試。 我目前的想法是BroadcastReceiverConnectivityManager.CONNECTIVITY_ACTION然後存儲布爾connected某處我可以在我的其他代碼查找。

有人知道如何以儘可能乾淨的方式解決這個問題?

在此先感謝!

+0

看到thislink http://stackoverflow.com/questions/19050444/how-to-handle-with-no-internet-and-lost-connection-in-android/19050796#19050796 這或許可以幫助... – mananjani

+0

這可以幫助http://www.gadgetsaint.com/android/no-internet-connectivity-android/ – ASP

+0

@ASP看起來很有趣。但Activity應該從onPause中的ConnectionReceiver中移除Listener以確保沒有內存泄漏。例如如果你的應用程序有一個不需要接收器的後臺服務,那麼這個活動會將它保留在靜態字段中,從而泄漏它。 – Dodge

回答

0
public static boolean isConnected(Context context) { 
    final ConnectivityManager conMgr = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo(); 
    if (activeNetwork != null && activeNetwork.getState() == NetworkInfo.State.CONNECTED) { 
     return true; 
    } else { 
     return false; 
    } 
} 

您可以使用此方法來檢查網絡狀態。

+0

我用isConnected方法保持我的舊方式,但用你的代碼(我直接檢查了NetworkInfo的wifi,wimax和3G /手機) – Dodge

0

最簡潔的方式是註冊一個程序化註冊的Recever,用於您在活動中指定的操作。

添加到您的onCreate()方法。

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 
filter.addAction(AWCMClientConstants.AWCM_STARTED); 
getActivity().registerReceiver(mNetworkStateChangedReceiver, filter); 

將此作爲內部類添加到您的活動中。

private class NetworkStateChangedReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Detect from Intent what's the change and Do what you want to. 
    } 
} 
1

加入其appStatus類在你的包

import android.content.Context; 
    import android.net.ConnectivityManager; 
    import android.net.NetworkInfo; 
    import android.util.Log; 

     public class AppStatus { 

      private static AppStatus instance = new AppStatus(); 
      private ConnectivityManager connectivityManager; 
      private static Context context; 
      private boolean connected = false; 

      public static AppStatus getInstance(Context ctx) { 

       context = ctx; 
       return instance; 
      } 

      // Check internet connection available 
      public Boolean isOnline(Context con) { 

       try { 
        connectivityManager = (ConnectivityManager) con 
          .getSystemService(Context.CONNECTIVITY_SERVICE); 

        NetworkInfo networkInfo = connectivityManager 
          .getActiveNetworkInfo(); 
        connected = networkInfo != null && networkInfo.isAvailable() 
          && networkInfo.isConnected(); 
        return connected; 

       } catch (Exception e) { 
        Log.v("connectivity", e.toString()); 
       } 

       return connected; 
      } 
     } 

現在得到這個類方法來查找網絡的可用性,如下圖所示:

if (AppStatus.getInstance(Activity.this).isOnline(
           Activity.this)) { 
     } 

在AndroidManifest

<uses-permission android:name="android.permission.INTERNET" /> 
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
添加這些權限
+0

好吧,你使用的方式很多的權限,你也不需要getInstance的東西。 – Dodge

+0

@Dodge:不客氣。感謝您的糾正。 –