处理互联网可用性的最佳做法

时间:2013-09-28 05:33:32

标签: android

我的Android应用程序在很大程度上取决于Internet连接。

这是一个适用于Internetradio的应用程序。 MainActivity显示当前信息,例如是否有播放dj或是否有播放列表(并且不时刷新其数据)。

还有两项活动可以显示来自互联网的更多数据(跟踪列表和即将播出的节目)。

目前我检查了我的mainactivity启动,我测试是否连接了wifi,移动或wimax,如果没有连接,我会显示一条消息并退出应用程序。

但我觉得这很糟糕。首先,我认为关闭应用程序并不是一个好主意,而且检查也是一次。因此,如果我打开应用程序,然后转为平面模式,应用程序将继续运行并尝试更新数据 - >失败...

我现在需要的是一个建议我如何改进“我在线”测试。 我当前的想法是BroadcastReceiver ConnectivityManager.CONNECTIVITY_ACTION,然后在某处存储一个布尔connected,我可以在其他代码中查找。

有人知道如何以尽可能干净的方式解决这个问题吗?

提前致谢!

3 个答案:

答案 0 :(得分: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" />

答案 1 :(得分: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.
    }
}

答案 2 :(得分: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;
    }
}

您可以使用此方法检查Internet状态。