2014-02-18 33 views
5

我正在開發涉及多個片段的應用程序。 在每個片段中,我必須調用Web服務來獲取數據。Android片段:用於Web服務調用的生命週期方法

目前我打電話給web服務onCreateView() Fragment的方法。問題我得知,無論何時進行Web服務調用,並且如果設備方向改變,則新的Web服務調用開始調用。

我想這可能是因爲onCreateView()方法在配置更改時被調用。

我該如何解決這個問題。以及我應該使用哪種生命週期方法來調用Web服務,以便它只能被調用一次

+0

我有同樣的問題。當我將選項卡旋轉90度時,會再次調用onCreate,並嘗試重新打開已打開的套接字,並且由於在轉換選項卡之前套接字未關閉,因此會發生錯誤並且應用程序異常終止。你的情況與我的不同,因爲你沒有收到錯誤,只是開始一個新的連接 – mangusta

+0

我試圖找到一些特定的事件,以便在活動重新啓動前攔截方向改變並關閉套接字,但沒有成功。有一點是肯定的,當方向改變 – mangusta

+0

PS時,調用onCreate()。嗯,只是意識到,我可以檢查是否在'onCreate()'的開頭打開或關閉它,如果是的話: – mangusta

回答

2

我已經通過以下解決方法

  1. 爲每個Web服務調用方法操作標識符解決了這個。例如。例如,「驗證」登錄調用

  2. 創建的ArrayList的一個對象說currentTasks

    ArrayList<String> currentTasks = new ArrayList<String>(); 
    
  3. 在我打電話的web服務的每一個方法,檢查相應方法的操作標識已經出現在ArrayList中。如果沒有,然後開始操作。其中上述操作的響應被接收

    String operationId = "Authentication"; 
    if(currentTasks.indexOf(operationId) == -1) 
    { 
        <do web service call operation here> 
        currentTasks.add(operationId); 
    } 
    
  4. 的方法,從ArrayList中

    if(currentTasks.indexOf("Authentication") != -1){ 
        currentTasks.remove("Authentication"); 
    } 
    

此除去操作標識將確保呼叫不會去這是目前正在進行Web方法。

我知道這不是實現它的最好方法,這可能不是最佳實踐,但現在這對我來說很有效。

0

如果您的Web服務代碼由於設備方向更改而重新啓動,那麼您可能會使用AsyncTask。這是AsyncTasks的常見問題,您有幾種方法可以解決它。

一個常見的解決方法是將AsyncTask包裹在一個不可見的Fragment周圍,並確保這個片段不會在方向更改期間被破壞並重新創建。看看這個教程如何去做:Retaining Objects Across Config Changes

+0

你能提供一些代碼來解釋這個嗎? – silwar

+0

查看我上面添加的鏈接。如果您訪問該網站,請查看「推薦:管理保留片段內的對象」部分以獲取完整示例。 – Henrique

0

一個簡單的解決方案是使用指向asynctask的靜態變量。如果變量不爲null,則創建並調用AsyncTask。

問候, Prateek

+0

請注意這種方法。在旋轉過程中保持一個靜態變量非常容易出現內存泄漏。 – Henrique

+0

@亨利克你能否請你解釋一下這個案例 –

+0

完整的解釋是一個單獨的主題,太長而不能作爲評論添加,但僅僅作爲一個例子,假設你有一個靜態的AsyncTask,它擁有對它的引用所有者活動。如果活動因爲用戶離開而被破壞,但AsyncTask尚未完成,則該活動仍將保持活動狀態,因爲它具有實時引用。所以我們基本上保留了那些不應該在那裏的東西,應該已經被垃圾收集器清除了。嘗試搜索與其他特殊情況相似的android內存泄漏。 – Henrique