离线使用 QNetworkAccessManager

Posted

技术标签:

【中文标题】离线使用 QNetworkAccessManager【英文标题】:Using QNetworkAccessManager offline 【发布时间】:2016-08-11 12:19:21 【问题描述】:

我的应用程序由两个应用程序组成。其中一个可能会要求另一个通过 REST 调用(调用 localhost 上的 URL)执行一些命令。为此,我们使用QNetworkAccessManager(用于放置、获取和发布请求)。

现在有一个问题 - 设备有时可能会离线,当他这样做时 - 出于某种原因,我们无法通过访问管理器使用休息呼叫。它似乎是在它使用的网络配置被破坏时发生的(比如禁用 Wifi 适配器等)。当此配置恢复(启用 Wifi)时,访问管理器再次开始工作。

另一个细节 - 当我们在离线时启动应用程序 - 无论在线状态如何,它都能正常工作。可能与this有关。

这可以在 Win 和 Mac 上重现。

所以问题是,无论设备在线状态如何,我如何可靠地使用 QNetworkAccessManager 来实现此目的?我们仅将此管理器用于 localhost REST 调用。我应该设置什么默认网络配置或行为?

使用示例如下:

mNetManager = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setRawHeader("User-Agent", "AppName/1.0");
request.setUrl(QUrl(url));
*reply = mNetManager->get(request);

编辑:不需要在线状态,因为我只需要这个访问管理器来访问浏览器上的本地 URL

【问题讨论】:

肯定和承载管理有关。如果您将平台的承载插件移开,它会起作用吗? @peppe 感谢您的回复,并对我的冗长回答感到抱歉。这个错误出现在 qt 的承载插件和没有它的情况下。尽管不记名插件似乎增加了此错误的重现率(几乎每次而不是有时)。不幸的是,我无法真正删除它,因为我需要 Qt 的功能来检测应用程序其他部分的在线状态。它需要承载插件 @peppe 看来你是对的。一旦我从部署脚本中删除了 libqcorewlanbearer - 问题就消失了,性能也提高了。看来这个插件确实是 qt 5.5.1 - bugreports.qt.io/browse/QTBUG-50181 的错误,并导致比我发现的问题更多的问题。如果您将其发布为答案,我会接受它,因为是您从一开始就猜对了 对于那些可以选择的人:这个问题是fixed for 5.9.2。 @Morten242 谢谢!这正是问题所在。我只知道发生了一些可疑的事情,但无法将其全部放在一起 【参考方案1】:

看来您可以强制网络可访问性来获取本地内容:

mNetManager = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setRawHeader("User-Agent", "AppName/1.0");
request.setUrl(QUrl(url));
mNetManager->setNetworkAccessible(QNetworkAccessManager::Accessible); // <--
auto reply = mNetManager->get(request);

【讨论】:

【参考方案2】:

QNetworkAccessManager 具有网络可用性。为什么不使用它?

QNetworkAccessManager * mNetManager = new QNetworkAccessManager(this);
connect(mNetManager, &QNetworkAccessManager::networkAccessibleChanged,
        this, &YourClass::slotExecutedWhenNetworkAccessibilityChanges);

NetworkAccessibility netAcc = mNetManager->networkAccessible();

switch (netAcc) 
    case QNetworkAccessManager::Accessible:
        // You are online.
        break;

    case QNetworkAccessManager::NotAccessible:
        // You are offline.
        break;

    case QNetworkAccessManager::UnknownAccessibility:
    default:
        // You know nothing, Jon Snow.
        break;

【讨论】:

感谢您的回答,我知道这一点。这个问题的重点是在任何情况下都可靠地使用 networkAccessManager。因为连接到 localhost REST 服务器不需要在线。但是由于某种原因,当在线状态变为离线或机器进入睡眠状态(这会导致网络设备发生变化)时,我会失去任何连接

以上是关于离线使用 QNetworkAccessManager的主要内容,如果未能解决你的问题,请参考以下文章

百度地图离线导航要怎样使用?

百度地图离线怎么用,下过离线包,离线后能怎么使用,如果在线设置好路线后是不是可以关掉网络

什么叫离线地图

百度地图离线怎么用

使用 Quickblox 接收离线消息

如何使用Openlayers 3加载谷歌离线地图