2017-06-13 60 views
1

我覺得這個問題的答案太明顯了,但我仍然想問一些問題。使用Asynctasks進行需要響應的api調用是否有任何意義?

我正在創建一個Android應用程序,該應用程序在用戶第一次啓動應用程序時使用API​​發出多個HTTP POST/GET請求。所有這些請求都是通過在活動中啓動Asynctasks來完成的。

例如,有一個活動,用戶必須從API中檢索的列表中選擇一個項目。在他選擇一個之後,當應用程序將選擇發送給API以檢索另一個列表時,向用戶顯示進度條,並且在下一個活動中,用戶從該列表中選擇項目。顯然,用戶不能進入第二個列表,直到應用程序發送第一個列表的選擇後,才從服務器接收到響應。

在這種情況下,使用Asynctask發送第一個列表的選擇是否有任何意義,因爲用戶被阻止做任何事情(通過顯示進度條),直到收到響應,下一個活動開始。如果我只是在主線程上進行API調用,它會不會使代碼變得更加複雜?

我希望這不是太混亂。

謝謝

+0

你想取消你的AsyncTask並啓動第二個活動?無論如何,你不能從Android的主線程請求 –

+0

這將拋出主線程異常的網絡。 – Anmol

+0

已經有HTTPURLConnection庫,只會讓你收到你的PHP代碼的返回語句只檢查在Android上的okHttp庫其快速和有效 – MuTiny

回答

0

基本上你不能在主線程上調用api,因爲它會阻塞用戶界面。現在Android也不允許它發生並拋出'NetworkOnMainThread Exception'。將Asynctask用於任何需要幾秒鐘的任務並且在其中獲得回調,這在你進入下一個屏幕之前是必需的。做

最好的辦法是通過使用網絡庫:

請參閱本 https://developer.android.com/training/volley/simple.html

+0

謝謝你的回答。到目前爲止,我只使用過標準的Android庫。我會考慮Volley。 – Jas

0

你不能在主線程做netwok呼叫首先,這將提高NetworkOnMainThreadException,您仍然可以通過這個通過添加幾行之後在你的活動

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 

例外,但它總是建議在後臺進行網絡操作, 否則可能會導致您的應用停止響應,並可能導致操作系統因爲表現不佳而導致操作系統查殺您的應用,請仔細閱讀此文章link

+0

這很有趣。但我認爲我會安全地玩,並完全防止這種例外。謝謝回答。 – Jas

0

任何需要超過幾秒鐘才能執行的操作應添加到單獨的線程。所有網絡操作應該在AsyncTask上執行,或者看看RxJava和RxAndroid。要特定於您的操作,可以在onPostExecute中執行網絡調用期間的任何UI操作。如果你使用線程類,然後使用處理程序。

+0

堅持網絡運營的Asynctask似乎是普遍的共識。謝謝你的答案。我使用一個單獨的處理程序類,它從一個活動內部的調用Asynctask接收參數,將其發送到服務器,並從服務器接收並返回響應。 – Jas

2

我完全懷疑你的疑惑。好問題。造成這種懷疑的根本原因是因爲您認爲在流程完成之前您無需與應用程序進行交互。但你實際上想要。事件進度條會凍結,如果你能做到這樣的事情。

好吧,讓我們假設你甚至沒有ProgressBar。但是,處理不同的UI組件,如Spinners,EditTexts不是主線程的唯一職責。它應該在活動生命週期中定義不同的回調。在主線程中執行大任務也會凍結onPause(),onStop()等回調函數。這就是爲什麼'NetworkOnMainThreadException'正在被使用。

+0

我明白了。感謝您的詳細解釋。我忘了考慮它會如何影響進度條。 – Jas

+0

不客氣:-) –

0

正如其他人所說,如果主線程用於網絡操作,它會使您的應用程序無響應。

用戶可能希望通過從菜單或操作欄啓動任何可用於啓動其他流的活動來啓動應用程序中的不同流程。

+0

事實上,這是事實。有幾個活動/片段(主要是在首次使用和設置應用程序時),不會讓用戶選擇其他任何操作,只能等待應用程序根據用戶的輸入從服務器獲取響應。 但現在我明白了,通過標準的做法,根本不是正確的做法。 – Jas

相關問題