Aer*_*ius 7 c++ qt android qnetworkaccessmanager
我在Android上的Qt 5.5中使用QNetworkAccessManager时遇到问题.通过http GET下载一个简单的小图形文件会导致很多垃圾收集调用,并在此期间锁定UI.随后的GET可以完美地工作,没有这些GC调用.代码如下:
void DownloadManager::downloadFile(QUrl fromUrl, QString toFilePath) {
_currentFilePath = toFilePath;
QNetworkRequest request;
request.setUrl(fromUrl);
qDebug() << "before";
_currentReply = _mgr.get(request);
qDebug() << "after";
connect(_currentReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError)));
connect(_currentReply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64,qint64)));
connect(_currentReply, SIGNAL(finished()), this, SLOT(downloadFinished()));
}
Run Code Online (Sandbox Code Playgroud)
DownloadManager是一个自定义的QObject派生类,没有任何与get请求相关的特殊功能._mgr是在DownloadManagers cTor期间分配的QNetworkAccessManager对象.
正如您所看到的,这只是一个获取请求的教科书示例,没有什么太花哨的.正如我所说:它在大多数情况下都有效.只有第一个get请求最终会像这样:
D/ .../downloadmanager.cpp:61 (void DownloadManager::downloadFile(QUrl, QString)): before
D/dalvikvm(13298): GC_CONCURRENT freed 2290K, 25% free 10911K/14407K, paused 2ms+3ms, total 29ms
D/dalvikvm(13298): GC_CONCURRENT freed 501K, 25% free 10884K/14407K, paused 13ms+2ms, total 35ms
D/dalvikvm(13298): GC_CONCURRENT freed 524K, 25% free 10892K/14407K, paused 12ms+3ms, total 36ms
D/dalvikvm(13298): WAIT_FOR_CONCURRENT_GC blocked 6ms
D/dalvikvm(13298): GC_CONCURRENT freed 537K, 25% free 10887K/14407K, paused 2ms+9ms, total 32ms
D/dalvikvm(13298): WAIT_FOR_CONCURRENT_GC blocked 14ms
D/dalvikvm(13298): GC_CONCURRENT freed 840K, 25% free 10899K/14407K, paused 12ms+3ms, total 38ms
D/dalvikvm(13298): WAIT_FOR_CONCURRENT_GC blocked 11ms
D/dalvikvm(13298): GC_CONCURRENT freed 1294K, 25% free 10901K/14407K, paused 2ms+2ms, total 27ms
D/dalvikvm(13298): WAIT_FOR_CONCURRENT_GC blocked 11ms
D/dalvikvm(13298): GC_CONCURRENT freed 1187K, 22% free 11330K/14407K, paused 2ms+2ms, total 30ms
D/dalvikvm(13298): WAIT_FOR_CONCURRENT_GC blocked 15ms
D/dalvikvm(13298): GC_CONCURRENT freed 1459K, 19% free 11919K/14535K, paused 13ms+4ms, total 64ms
D/dalvikvm(13298): WAIT_FOR_CONCURRENT_GC blocked 18ms
D/ .../downloadmanager.cpp:65 (void DownloadManager::downloadFile(QUrl, QString)): after
Run Code Online (Sandbox Code Playgroud)
我根本不明白导致GC发生的原因是什么 - 一切都需要大约一个半秒才能解决(对于下载应该花费一瞬间,而且是异步而不是锁定用户界面).
附加信息:
它始终只是第一次触发此操作的下载.即使是完全相同的文件,后续下载也能完美运行
如果确切位置的文件是否具有确切名称,则无关紧要.下载文件,删除它,返回应用程序并重新加载它提供了相同的结果 - 第一次获取很慢并且有GC,第二次工作完全正常.
我从QML文件调用所有这些,导致singleton c ++对象调用DownloadManager :: downloadFile.
除了QML UI之外,应用程序中没有运行任何其他内容.没有繁重的数据交换,没有其他线程的后台加载,没有.
我会感谢任何解决这个问题的方法.
我没有在 Android 上尝试过,但在 Windows 上也遇到了同样的问题。因为这些是相同的症状,所以我想说这可能是相同的原因,即实现在第一次 get() 调用时延迟加载一些共享库。当使用加密连接时尤其如此;就我而言,我可以在 Visual Studio 中看到在第一次 get() 调用时加载了 19 个 DLL。
解决此问题的一种方法是使用connectToHost或connectToHostEncrypted预先连接到服务器,具体取决于您是否使用加密连接(例如 HTTPS)。我在应用程序启动时调用它,但任何时候 UI 空闲的时候都应该没问题。然后后续的 get() 调用都将具有相同的性能,包括第一个调用,因为库已加载并且连接已建立。我假设连接到任何服务器都会加载库。
有关一般错误(并非特定于 Android)的详细信息,请参阅https://forum.qt.io/topic/65201/qnetworkaccessmanager-first-get-very-slow/14 。