簡體   English   中英

Android http 回調和片段處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM