2015-02-06 37 views
2

這是純粹的測試目的和我的好奇心。我使用我的DataDownloader類從服務器獲取數據列表。它適用於不同的網址,如http://tiny-file-url,http://big-file-url。但是如果我通過兩個相同的URL,http://tiny-file-url,http://tiny-file-url,而來自http://tiny-file-url的數據非常小,那麼QNetworkAccessManager的第二個回覆是空的。然而兩個http://big-file-url似乎工作。我想知道QNetworkAccessManager在從同一網址請求小數據時是否有一些神奇功能?我似乎無法獲得有關Qt文檔網站的任何相關信息。Qt QNetworkReply readAll在再次請求相同的URL時返回空白

這裏是我DataDownloader類:

class DataDownloader : public QObject 
{ 
    Q_OBJECT 

public: 
    explicit DataDownloader(QObject* parent = 0); 
    virtual ~DataDownloader(); 

    QByteArray data() const; 
    void cancel(); 
    void download(QUrl url); 

    signals: 
    void isComplete(); 

    private slots: 
    void complete(QNetworkReply* reply); 

    private: 
    QNetworkAccessManager m_NetworkManager; 
    QByteArray m_Data; 
    QNetworkReply* m_pReply; 
}; 

DataDownloader::DataDownloader(QUrl url, QObject* parent) :QObject(parent) 
{ 
    connect(&m_NetworkManager, SIGNAL(finished(QNetworkReply*)), 
      SLOT(complete(QNetworkReply*))); 
} 

DataDownloader::~DataDownloader() 
{ 
} 

void DataDownloader::complete(QNetworkReply* reply) 
{ 
    // in the first download it returns data 
    // but the second time m_Data is empty 
    m_Data = reply->readAll(); 
    reply->deleteLater(); 

    if (!m_Data.isEmpty()) { 
     // no signal on the second try 
     emit isComplete(); 
    } 
} 

QByteArray DataDownloader::data() const 
{ 
    return m_Data; 
} 

void DataDownloader::cancel() 
{ 
    m_pReply->abort(); 
} 

void DataDownloader::download(QUrl url) 
{ 
    QNetworkRequest request(url); 
    m_pReply = m_NetworkManager.get(request); 
} 

調用這個DataDownloader如下面的代碼:

void PluginManager::downloadPlugins() 
{ 
    m_DownloadIndex++; 

    savePlugin(); 

    if (m_DownloadIndex < m_PluginList.size()) { 
     QUrl url; 
     // alway return the same url here 
     QString pluginUrl = getPluginUrl(m_PluginList.at(m_DownloadIndex)); 
     url.setUrl(pluginUrl); 

     if (m_pPluginDownloader == NULL) { 
      m_pPluginDownloader = new DataDownloader(); 
      // call this function again when isComplete is signaled 
      connect(m_pPluginDownloader, SIGNAL(isComplete()), this, SLOT(downloadPlugins())); 
     } 
     m_pPluginDownloader->download(url); 
    } 
} 
+2

當天隨機代碼建議:創建一個'QNetworkAccessManager'而不是每個下載器一個更好。 – peppe 2015-02-06 19:03:00

+0

順便說一句,你是100%有信心http:// tiny-file-url總是按預期工作? – alediaferia 2015-02-09 12:00:58

+0

我對此非常有信心,因爲我可以將數據作爲文件(包含調試文本)下載並使用編輯器打開。 – Jerry 2015-02-09 12:04:36

回答

1

我想,在這裏你將它連接到downloadPlugins槽前isComplete被髮射。首先嚐試連接該信號,然後執行下載操作:

m_pPluginDownloader = new DataDownloader(url); 

connect(m_pPluginDownloader, SIGNAL(isComplete()), this, SLOT(downloadPlugins())); 

m_pPluginDownloader.download(); 

而是在構造函數中執行取得動作的,這樣做在一個名爲download插槽:

void DataDownloader::download() 
{ 
    QNetworkRequest request(url); 
    m_pReply = m_NetworkManager.get(request); 
} 

另一點是,它不是每次都需要創建一個新的實例DataDownloader。您可以在PluginManager的構造函數中創建實例,並在此處連接isComplete信號。然後您可以在download插槽中提供url作爲參數。

+0

嗨Nejat,謝謝你的回覆。我試過你的建議,它和以前一樣。我仍然在第二次下載時收到空的數據。 – Jerry 2015-02-09 11:04:42

+0

嗨Nejat,似乎這個問題只發生在兩個相同的網址和來自這些網址的數據很小。我要測試兩個包含小數據的不同網址,看看它是否有所不同。 – Jerry 2015-02-09 11:41:36

+0

所以有我的測試結果: tiny-file-url,大文件url作品 big-file-url,大文件url作品 tiny-file-1-url,tiny-file-2-url作品 tiny-file-url,tiny-file-url在第二次請求時返回空 – Jerry 2015-02-09 11:56:54

相關問題