[英]Android http callback and fragment handling
我有以下代碼(它的骨架):
PostRequester(..., Fragment caller, final PostRequesterResponse callback ) {
StringRequest stringRequest = new StringRequest(Request.Method.POST, baseUrl,
response -> {
if (callback != null && caller != null) {
callback.onResponse(response);
}
})...
從片段調用上述示例:
...(this, result -> {
try {
if (result.contains("error")) {
throw new Exception(new JSONObject(result).getString("error"));
}
JSONObject jo = new JSONObject(result).getJSONObject("result");
tvIncome.setText(getString(R.string.income));
} catch (Exception e) {
...showPopup(getString(...));
}
我確實檢查了回調和調用者是否為空,但我得到以下信息:
Fatal Exception: java.lang.IllegalStateException: Fragment x2{8dc73ab (83fe8dc9-f7d2-4324-abf2-c4aae15c37ef)} not attached to a context.
它在第一個getString()
失敗,然后在異常的那個中失敗。 也許調用者不是空的,但它是分離的。 我可以添加caller.isDetached()
條件,但用戶可能隨時“返回”並分離片段。 在每行代碼之后檢查 isDetached 不是一個好主意。
在這種情況下可以做什么? 謝謝
正如我所見,您應該像這樣調用 getActivity().getString() :
tvIncome.setText(getActivity().getString(R.string.income))
但在 getActivity() 不為空之前也必須檢查!!!
您可以將caller.isDetached()
添加到回調條件中。 正如您所提到的, but the user might "go back" and detach the fragment at any time.
在這種情況下,您無論如何都不希望片段接收回調。 如果你想處理響應而不考慮片段,你不應該從片段中調用它,而是從其他地方調用它,更可持續。 在這種情況下,我建議不要在請求邏輯中涉及片段,只涉及任何調用者都可以注冊的回調。
對於您的后續問題:
片段或需要獲取響應的人應實現回調接口。 例如:
1.聲明稱為接口INetworkListener
與方法onResponse(Response response)
2. FragmentX 實現 INetworkListener
3. 在 FragmentX 中覆蓋 onResponse(Response response) 並處理那里的響應
4. 當您進行網絡調用時,不要將片段和回調作為參數,而是使用INetworkListener
類型的參數callback
(即實現此接口的人,在我們的例子中,是片段。因此,如果從片段調用,參數將是this
.
5. 在你的調用函數中,當響應准備好調用callback.onResponse(response)
就像你現在正在做的那樣,片段將在它覆蓋的 onResponse() 方法中接收它。
它和你現在擁有的有什么不同? 好吧,從技術上講不是。
基本上將片段作為參數傳遞可能是內存泄漏的來源,並不是一個很好的做法。
打電話時這很重要。 例如,如果您在片段的onCreate
調用它,響應可能會在附加片段之前返回。
您的代碼的問題在於它在訪問其 ui 之前沒有考慮片段的狀態。
如果您想在片段恢復后對其進行更新,您可以在更新片段的 ui 響應之前使用帶有檢查的回調,例如if (!fragment.isAdded) return
,以防片段被分離。
但是如果你想用數據加載片段,我建議提前准備網絡數據,用數據初始化片段,而不是為此目的使用片段回調。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.