1

在检查网络是否可用时,我在获得一致的结果时遇到了一些问题。

我在 AppPreferences 类中使用此代码片段来检查网络的可用性。

/**
     * @return the networkAvailable
     */
    public boolean isNetworkAvailable() {
        connectionManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        networkAvailable = connectionManager.getActiveNetworkInfo() != null && connectionManager.getActiveNetworkInfo().isConnected();
        return networkAvailable;
    }

在每次运行之前,我将上下文设置如下:

timer.scheduleAtFixedRate(

                new TimerTask() {

                    public void run() {

                        appPreferences.setContext(getBaseContext());

                        if (appPreferences.isNetworkAvailable()){

                            // perform task

                        }

                    }
                },
                0,
                UPDATE_INTERVAL);

我确实知道它与后台线程无关,因为我有一个 onReceive 调用执行相同的逻辑,但此检查仍然失败。

它似乎主要发生在它在蜂窝数据连接和 wifi 之间移动时,反之亦然。即使我更新它,它开始的上下文似乎仍然存在。

有谁知道这里可能是什么问题?

4

1 回答 1

1

似乎活动网络信息将保持服务/活动/接收器的上下文启动时的状态。因此,如果您在网络上启动它,然后断开连接(即从 3G 移动到 Wifi 并断开 3G 连接),它将保持在第一个活动连接上,从而使应用程序认为手机处于离线状态,即使它不是。

在我看来,最好的解决方案是使用 getApplicationContext 代替,因为它不会与您开始特定“任务”的时间相关联。

更新:相关的是,如果您在连接到 Wifi 的情况下长时间在 Android(特别是 Nexus One)上运行应用程序,请检查您确保在屏幕休眠时不要让 Wifi 休眠。您将能够在无线网络下的高级选项中进行设置。

于 2010-07-19T19:14:43.497 回答